Этюд это или нет, но такое неясное поведение, просто интересно почему.
Есть h-файл, в нем декларирован класс и пустой конструктор. Есть еще куча кода, который и вызывает проблему — это как бы и есть неизвестное. Упрощенно так:
test.h
class Class1
{
public:
Class1();
};
В test.cpp — уже определение:
#include"test.h"
Class1::Class1()
{
}
Так все работает.
Если же перенести определение в h-файл, вот так:
class Class1
{
public:
Class1(){}
};
(и убрать из cpp-файла, конечно) — то получаю ошибку: invalid application of 'sizeof' to an incomplete type 'namespace1::Class2'. Где Class2 — это другой класс, который как-то связан с Class1.
Вопрос мой вот в чем. Я думал что абсолютно без разницы в h-файле определение или нет — думал что это эквивалентно и во всех жизненных ситуациях проблемы не вызовет. И представить не мог, что если убрать из cpp-файла этот пустой конструктор и перенести в h-файл, то получим ошибку компиляции. Как же это возможно?
Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.
Re: Ошибка, если конструктор определен в h-файле (этюд?)
Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?
Ну просто сложно в это поверить с учетом непроходимой тупости того, что вы пишете.
Как иначе охарактеризовать ваш вопрос, в котором вы не удосужились (а скорее даже не подумали, что это нужно) привести минимальный пример, демонстрирующий актуальную проблему. В ваших псевдо-фрагментах нет ничего про Class2, но показывая только Class1 и сообщение об ошибке компилятора, связанной с Class2 (не Class1), вы просите вам что-то объяснить.
Здравствуйте, so5team, Вы писали:
S>Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?
Да какая тебе разница кто я? Причем тут переход на личности?
S>Ну просто сложно в это поверить с учетом непроходимой тупости того, что вы пишете. S>Как иначе охарактеризовать ваш вопрос, в котором вы не удосужились (а скорее даже не подумали, что это нужно) привести минимальный пример, демонстрирующий актуальную проблему. В ваших псевдо-фрагментах нет ничего про Class2, но показывая только Class1 и сообщение об ошибке компилятора, связанной с Class2 (не Class1), вы просите вам что-то объяснить.
Потому что проблема не известна. Как раз и вопрос в том, что может вызывать такое поведение — хотя бы один вариант.
Re[3]: Ошибка, если конструктор определен в h-файле (этюд?)
S>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.
Всмысле? У тебя же уже есть пример кода, демонстрирующий проблему. Зачем тебе еще один?
Re[2]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Muxa, Вы писали:
S>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.
M>Всмысле? У тебя же уже есть пример кода, демонстрирующий проблему. Зачем тебе еще один?
Это не пример, это проект с 300 тыс. строк кода. Просто так выцедить кусок оттуда и довести до минимально воспроизводимой проблемы — это пол дня работы (оплачивать не будут), по этому нету примера.
Здравствуйте, Shmj, Вы писали:
S>>Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?
S>Да какая тебе разница кто я?
Большая. Если подобный вопрос задает студент, то можно (и нужно) потратить время и объяснить с примером как хорошие вопросы должны задаваться.
Если же вы сеньор-помидор, но все еще не понимаете, как обращаться за помощью на публичный форум, то можно пожелать сменить профессию.
S>Причем тут переход на личности?
Потому что ваша личность засрала половину RSDN-а своей тупизной.
S>Потому что проблема не известна. Как раз и вопрос в том, что может вызывать такое поведение — хотя бы один вариант.
Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?
S>Это не пример, это проект с 300 тыс. строк кода. Просто так выцедить кусок оттуда и довести до минимально воспроизводимой проблемы — это пол дня работы (оплачивать не будут), по этому нету примера.
А RSDN-неры должны сделать для вас это бесплатно?
Re: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.
Да, могу.
И каждый день — без права на ошибку...
Re[4]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, so5team, Вы писали:
S>Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?
Хотя бы один пример как такая ошибка может возникать и с чем это может быть связано.
Я думал что эти два куска кода эквивалентны — что может сломать перенос пустого конструктора в h-файл?
Re[2]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, B0FEE664, Вы писали:
S>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции. BFE>Да, могу.
Докажите.
Re[5]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>>Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?
S>Хотя бы один пример как такая ошибка может возникать и с чем это может быть связано.
Я бы рискнул предположить, что имеет место быть что-то вроде:
Тогда компилятор при генерации конструктора Class1 споткнется о то, что он не знает, как по дефолту инициализировать Class1::member_.
Но, имхо, здесь должна быть другая диагностика. Так что предположу, что взаимоотношения Class1 и Class2 более своеобразные.
S>Я думал
Так, стоп. "Вы" и "думал" -- это несовместные вещи, не нужно врать и себе, и другим.
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, night beast, Вы писали:
NB>нет, без указателей такое не работает.
Вот и я о том же. Хотя, если экземпляры Class1 нигде кроме test.cpp явным образом не создаются (используются только ссылки/указатели на Class1), то почему бы и нет в каком-то из компиляторов (об этом ТС так же ничего не сказал).
NB>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>
Может и так. Но обычно для проблем с этим нужно определять в .hpp-файле пустой деструктор. Так что
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
S>Тогда компилятор при генерации конструктора Class1 споткнется о то, что он не знает, как по дефолту инициализировать Class1::member_. S>Но, имхо, здесь должна быть другая диагностика. Так что предположу, что взаимоотношения Class1 и Class2 более своеобразные.
Вот это уже по делу, хотя и не оно, к сожалению Для вашего примера перенос определения конструктора в cpp-файл ничего не меняет.
В любом случае благодарю за попытку, видимо не все так просто.
S>>Я думал S>Так, стоп. "Вы" и "думал" -- это несовместные вещи, не нужно врать и себе, и другим.
Пока вы не доказали что способны решить эту задачу.
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, night beast, Вы писали:
NB>нет, без указателей такое не работает. NB>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>
Совершенно верно — unique_ptr<Class2> внутри есть.
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, so5team, Вы писали:
S>Вот и я о том же. Хотя, если экземпляры Class1 нигде кроме test.cpp явным образом не создаются (используются только ссылки/указатели на Class1), то почему бы и нет в каком-то из компиляторов (об этом ТС так же ничего не сказал).
clang++ MacOS.
NB>>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2> S>Может и так. Но обычно для проблем с этим нужно определять в .hpp-файле пустой деструктор. Так что
Деструктор не трогал, он тоже присутствует. Естественно в h-файле только декларация.
Re[3]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции. BFE>>Да, могу. S>Докажите.
Докажу при условии, что вы пообещаете никогда в своей жизни больше не создавать файл с именем test.h
И каждый день — без права на ошибку...
Re[4]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Этюд это или нет, но такое неясное поведение, просто интересно почему.
Думаю, если ты даже не попытаешься максимально упросить код, который ещё воспроизводит проблему, а просто приведёшь полный текст ошибки, то найдутся те, кто догадается в чём проблема