Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 05:45
Оценка:
Этюд это или нет, но такое неясное поведение, просто интересно почему.

Есть 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-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 05.07.23 06:14
Оценка: 10 (2) +9 -1
Здравствуйте, Shmj

Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?

Ну просто сложно в это поверить с учетом непроходимой тупости того, что вы пишете.
Как иначе охарактеризовать ваш вопрос, в котором вы не удосужились (а скорее даже не подумали, что это нужно) привести минимальный пример, демонстрирующий актуальную проблему. В ваших псевдо-фрагментах нет ничего про Class2, но показывая только Class1 и сообщение об ошибке компилятора, связанной с Class2 (не Class1), вы просите вам что-то объяснить.



https://www.youtube.com/watch?v=N-8jkDqR58U
Re[2]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 06:18
Оценка: :)))
Здравствуйте, so5team, Вы писали:

S>Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?


Да какая тебе разница кто я? Причем тут переход на личности?

S>Ну просто сложно в это поверить с учетом непроходимой тупости того, что вы пишете.

S>Как иначе охарактеризовать ваш вопрос, в котором вы не удосужились (а скорее даже не подумали, что это нужно) привести минимальный пример, демонстрирующий актуальную проблему. В ваших псевдо-фрагментах нет ничего про Class2, но показывая только Class1 и сообщение об ошибке компилятора, связанной с Class2 (не Class1), вы просите вам что-то объяснить.

Потому что проблема не известна. Как раз и вопрос в том, что может вызывать такое поведение — хотя бы один вариант.
Re[3]: Ошибка, если конструктор определен в h-файле (этюд?)
От: kov_serg Россия  
Дата: 05.07.23 06:44
Оценка: +5
Здравствуйте, Shmj, Вы писали:

S>Как раз и вопрос в том, что может вызывать такое поведение — хотя бы один вариант.


Вы
Re: Ошибка, если конструктор определен в h-файле (этюд?)
От: Muxa  
Дата: 05.07.23 06:51
Оценка:
S>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.

Всмысле? У тебя же уже есть пример кода, демонстрирующий проблему. Зачем тебе еще один?
Re[2]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 07:01
Оценка: -2
Здравствуйте, Muxa, Вы писали:

S>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.


M>Всмысле? У тебя же уже есть пример кода, демонстрирующий проблему. Зачем тебе еще один?


Это не пример, это проект с 300 тыс. строк кода. Просто так выцедить кусок оттуда и довести до минимально воспроизводимой проблемы — это пол дня работы (оплачивать не будут), по этому нету примера.

Хотелось бы в принципе понять как такое возможно.
Отредактировано 05.07.2023 7:33 Shmj . Предыдущая версия . Еще …
Отредактировано 05.07.2023 7:14 Shmj . Предыдущая версия .
Re[3]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 05.07.23 07:39
Оценка: 1 (1) +7
Здравствуйте, Shmj, Вы писали:

S>>Слушайте, а вы точно программист? И пишете работающие программы хоть на каком-то языке программирования?


S>Да какая тебе разница кто я?


Большая. Если подобный вопрос задает студент, то можно (и нужно) потратить время и объяснить с примером как хорошие вопросы должны задаваться.
Если же вы сеньор-помидор, но все еще не понимаете, как обращаться за помощью на публичный форум, то можно пожелать сменить профессию.

S>Причем тут переход на личности?


Потому что ваша личность засрала половину RSDN-а своей тупизной.

S>Потому что проблема не известна. Как раз и вопрос в том, что может вызывать такое поведение — хотя бы один вариант.


Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?

S>Это не пример, это проект с 300 тыс. строк кода. Просто так выцедить кусок оттуда и довести до минимально воспроизводимой проблемы — это пол дня работы (оплачивать не будут), по этому нету примера.


А RSDN-неры должны сделать для вас это бесплатно?
Re: Ошибка, если конструктор определен в h-файле (этюд?)
От: B0FEE664  
Дата: 05.07.23 07:46
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.

Да, могу.
И каждый день — без права на ошибку...
Re[4]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 08:01
Оценка: :)))
Здравствуйте, so5team, Вы писали:

S>Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?


Хотя бы один пример как такая ошибка может возникать и с чем это может быть связано.

Я думал что эти два куска кода эквивалентны — что может сломать перенос пустого конструктора в h-файл?
Re[2]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 08:02
Оценка: :))) :))) :))
Здравствуйте, B0FEE664, Вы писали:

S>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.

BFE>Да, могу.

Докажите.
Re[5]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 05.07.23 08:07
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>>Еще раз, для совсем уж ограниченных: не зная ничего про Class2, про его взаимоотношения с Class1, толком вам не ответишь. Можно разве что гадать на кофейной гуще, но зачем это кому-то?


S>Хотя бы один пример как такая ошибка может возникать и с чем это может быть связано.


Я бы рискнул предположить, что имеет место быть что-то вроде:
// .hpp-файл.
class Class2; // Предварительное объявление.

class Class1 {
  Class2 member_;
  ...
public:
  Class1() {}
  ...
};

// .cpp-файл.
class Class2 { ... }; // Полное определение.


Тогда компилятор при генерации конструктора Class1 споткнется о то, что он не знает, как по дефолту инициализировать Class1::member_.
Но, имхо, здесь должна быть другая диагностика. Так что предположу, что взаимоотношения Class1 и Class2 более своеобразные.

S>Я думал


Так, стоп. "Вы" и "думал" -- это несовместные вещи, не нужно врать и себе, и другим.
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
От: night beast СССР  
Дата: 05.07.23 08:12
Оценка: +3
Здравствуйте, so5team, Вы писали:

S>Я бы рискнул предположить, что имеет место быть что-то вроде:

S>
S>// .hpp-файл.
S>class Class2; // Предварительное объявление.

S>class Class1 {
S>  Class2 member_;
S>  ...
S>public:
S>  Class1() {}
S>  ...
S>};

S>// .cpp-файл.
S>class Class2 { ... }; // Полное определение.
S>


нет, без указателей такое не работает.
больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 05.07.23 08:18
Оценка:
Здравствуйте, night beast, Вы писали:

NB>нет, без указателей такое не работает.


Вот и я о том же. Хотя, если экземпляры Class1 нигде кроме test.cpp явным образом не создаются (используются только ссылки/указатели на Class1), то почему бы и нет в каком-то из компиляторов (об этом ТС так же ничего не сказал).

NB>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>


Может и так. Но обычно для проблем с этим нужно определять в .hpp-файле пустой деструктор. Так что
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 09:02
Оценка: :))) :)
Здравствуйте, so5team, Вы писали:

S>Я бы рискнул предположить, что имеет место быть что-то вроде:

S>
S>// .hpp-файл.
S>class Class2; // Предварительное объявление.

S>class Class1 {
S>  Class2 member_;
S>  ...
S>public:
S>  Class1() {}
S>  ...
S>};

S>// .cpp-файл.
S>class Class2 { ... }; // Полное определение.
S>


S>Тогда компилятор при генерации конструктора Class1 споткнется о то, что он не знает, как по дефолту инициализировать Class1::member_.

S>Но, имхо, здесь должна быть другая диагностика. Так что предположу, что взаимоотношения Class1 и Class2 более своеобразные.

Вот это уже по делу, хотя и не оно, к сожалению Для вашего примера перенос определения конструктора в cpp-файл ничего не меняет.

В любом случае благодарю за попытку, видимо не все так просто.

S>>Я думал

S>Так, стоп. "Вы" и "думал" -- это несовместные вещи, не нужно врать и себе, и другим.

Пока вы не доказали что способны решить эту задачу.
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 09:03
Оценка: :))) :)
Здравствуйте, night beast, Вы писали:

NB>нет, без указателей такое не работает.

NB>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>

Совершенно верно — unique_ptr<Class2> внутри есть.
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 05.07.23 09:08
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Пока вы не доказали что способны решить эту задачу.


Shame on me!
Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 09:09
Оценка:
Здравствуйте, so5team, Вы писали:

S>Вот и я о том же. Хотя, если экземпляры Class1 нигде кроме test.cpp явным образом не создаются (используются только ссылки/указатели на Class1), то почему бы и нет в каком-то из компиляторов (об этом ТС так же ничего не сказал).


clang++ MacOS.

NB>>больше похоже на использование внутри Class1 чего-то вроде unique_ptr<Class2>

S>Может и так. Но обычно для проблем с этим нужно определять в .hpp-файле пустой деструктор. Так что

Деструктор не трогал, он тоже присутствует. Естественно в h-файле только декларация.
Re[3]: Ошибка, если конструктор определен в h-файле (этюд?)
От: B0FEE664  
Дата: 05.07.23 09:58
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>>>Можете ли вы привести код, который продемонстрирует такую проблему? Т.е. чтобы при переносе в h-файл пустой конструктор — возникала ошибка компиляции.

BFE>>Да, могу.
S>Докажите.

Докажу при условии, что вы пообещаете никогда в своей жизни больше не создавать файл с именем test.h
И каждый день — без права на ошибку...
Re[4]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 10:26
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Докажу при условии, что вы пообещаете никогда в своей жизни больше не создавать файл с именем test.h


Подождем, может еще кто знает.
Re: Ошибка, если конструктор определен в h-файле (этюд?)
От: ArtDenis Россия  
Дата: 05.07.23 10:45
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Этюд это или нет, но такое неясное поведение, просто интересно почему.


Думаю, если ты даже не попытаешься максимально упросить код, который ещё воспроизводит проблему, а просто приведёшь полный текст ошибки, то найдутся те, кто догадается в чём проблема
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.