Re[12]: Ошибка, если конструктор определен в h-файле (этюд?)
От: T4r4sB Россия  
Дата: 05.07.23 18:46
Оценка: +10 :))) :)))
Здравствуйте, Shmj, Вы писали:

S>Вопрос то тянет на этюд — никто из "знатоков" так и не смог ответить.


Я знаю ещё более продвинутый вопрос, который тянет на этюд и на который никто не ответит.
  Скрытый текст
У меня проект не собирается, почему? Подробности не скажу.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[5]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Teolog  
Дата: 05.07.23 19:33
Оценка: +1
S>Я думал что эти два куска кода эквивалентны — что может сломать перенос пустого конструктора в h-файл?
Да — они эквивалентны, и причем здесь это?
какая буква в словосочетании "incomplete type" не ясна?
заголовок с типом class2 добавлен в .cpp но не в .h, либо не добавлен но имеет с ним циклическую зависимость
Так будет с каждым кто не понимает зачем c++ разделяет определения и имплементации.
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 05.07.23 19:38
Оценка: :)
Здравствуйте, Teolog, Вы писали:

T>Да — они эквивалентны, и причем здесь это?

T>какая буква в словосочетании "incomplete type" не ясна?
T>заголовок с типом class2 добавлен в .cpp но не в .h, либо не добавлен но имеет с ним циклическую зависимость
T>Так будет с каждым кто не понимает зачем c++ разделяет определения и имплементации.

А теперь закрепите это примером, который демонстрирует данное поведение.
=сначала спроси у GPT=
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Videoman Россия https://hts.tv/
Дата: 05.07.23 21:01
Оценка: 6 (1)
Здравствуйте, Shmj, Вы писали:

S>- не компилируется. unique_ptr хочет заранее знать какой класс даже в этом случае, не смотря на то, что конструктор только декларирован — ему пофиг.


Потому что дело не только в конструкторе, но и в деструкторе. std::unique_ptr<Class2> деструктор для неполного объекта также не может создать. С деструктором Class1 проделай тоже самое:
сlass Class2;

class Class1
{
public:
    Class1();
    ~Class1();
private:
    std::unique_ptr<Class2> ptr;
};

//... тут все тоже самое
Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
От: PM  
Дата: 05.07.23 21:51
Оценка:
Здравствуйте, Videoman, Вы писали:

S>>- не компилируется. unique_ptr хочет заранее знать какой класс даже в этом случае, не смотря на то, что конструктор только декларирован — ему пофиг.


V>Потому что дело не только в конструкторе, но и в деструкторе. std::unique_ptr<Class2> деструктор для неполного объекта также не может создать. С деструктором Class1 проделай тоже самое:


Емнип, у Visual C++ была похожее поведение — если не объявлять деструктор явно, то генерировалась inline версия:
// test.hpp
сlass Class2;

class Class1 {
    std::unique_ptr<Class2> ptr;
    // нет явного ~Class1(), так что компилятор создает inline версию
    // в которой пытается вызывать деструктор Class2 
};


Мне лень искать подтверждение, насколько это соответсвует стандарту.

Исправление — объявить деструктор в классе, определить в реализации:
// test.hpp
сlass Class2;

class Class1 {
    std::unique_ptr<Class2> ptr;
    ~Class1();
};


// test.cpp
#include "test.hpp"

class Class2 {}; // полное определение нужно в любом случае

Class1::~Class1() = default; // достаточно сгенерированной версии, главное чтобы Class2 был здесь доступен
Re[13]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 04:15
Оценка: :))) :))) :))) :)
Здравствуйте, rg45, Вы писали:

S>>А вот оно видите как — нужно смотреть на суть.

R>На твою суть я тут уже насмотрелся предостаточно.

Ты зацикливаешься на человеке. Как видишь — это глупо, т.к. человек всего лишь сосуд — он наполняется разной инфой и его содержимое постоянно изменяется.

Уже много месяцев на форуме не было достойного вопроса. И вот, наконец, такой вопрос появился.
=сначала спроси у GPT=
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 04:52
Оценка:
Здравствуйте, so5team, Вы писали:

S>В этом случае, если не путаю, перенос конструктора Class1 из .cpp в .h и должен привести к ошибке компиляции.


Проверил с clang++ на MacOS

/Users/test/Desktop/cmake_test/Class1.h:6:43: error: allocation of incomplete type 'Class2'
std::unique_ptr<Class2> ptr_member_{new Class2{}};
^~~~~~
/Users/test/Desktop/cmake_test/Class1.h:3:7: note: forward declaration of 'Class2'
class Class2;
^
1 error generated.
make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1


— это ваш код оригинальный, который должен работать...
=сначала спроси у GPT=
Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 05:16
Оценка:
Здравствуйте, Shmj, Вы писали:

S>- это ваш код оригинальный, который должен работать...


Кто должен, кому должен?

Интеллектуальный вы наш, перечитайте, пожалуйста, написанное мной и найдите хоть одно утверждение "должен".
Re[12]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 05:19
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вопрос то тянет на этюд — никто из "знатоков" так и не смог ответить.


Какой же вы молодец, уели целый форум! Так нам и надо!

S>Возможно придется мне на выходных найти время и таки выцедить минимальный пример (надеюсь что нет).


Страшно представить, на какие лишения вы вынуждены будете пойти, чтобы уговорить RSDN дать ответ на ваш вопрос...
Re[9]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 05:25
Оценка:
Здравствуйте, PM, Вы писали:

PM>Исправление — объявить деструктор в классе, определить в реализации:


error: invalid application of 'sizeof' to an incomplete type 'Class2'
static_assert(sizeof(_Tp) > 0,
^~~~~~~~~~~


Это в вашем оригинальном коде — с конструктором по умолчанию. А по условию задачи должно компилироваться и ломаться если конструктор явно реализовать в H-файле.
=сначала спроси у GPT=
Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 05:48
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Потому что дело не только в конструкторе, но и в деструкторе. std::unique_ptr<Class2> деструктор для неполного объекта также не может создать. С деструктором Class1 проделай тоже самое:

V>
V>сlass Class2;

V>class Class1
V>{
V>public:
V>    Class1();
V>    ~Class1();
V>private:
V>    std::unique_ptr<Class2> ptr;
V>};

V>//... тут все тоже самое
V>


В принципе это уже близко.

Но у меня смотрите какой кейс был. Был класс с конструктором по умолчанию. Я быстро для тестов хотел добавить конструктор с параметром. Естественно этот конструктор с параметром потребовал явной реализации конструктора без параметра (пустого), чтобы старый код не отвалился. Добавил по быстрому в h-файл этот конструктор без параметров — и оно перестало компилироваться. Т.е. если конструктора нет вообще (используется по умолчанию все) — компилируется. Если добавить пустой конструктор в CPP-файле — тоже компилируется. А вот в H-файле не компилируется.

Т.е. разница:

1. Должно компилироваться, если конструктор не декларирован явно (т.е. когда по умолчанию). У вас — не компилируется если не определен явно.
2. Должно компилироваться, если в H-файле декларация а в CPP-определение (реализация). Тут ОК — ваш кейс совпадает.
3. Должно перестать компилироваться, если в H-файле определение (реализация). Тут ОК — ваш кейс тоже совпадает.

Хотелось бы еще 1 кейс чтобы тоже совпадал.
=сначала спроси у GPT=
Re[14]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 06:02
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Уже много месяцев на форуме не было достойного вопроса. И вот, наконец, такой вопрос появился.


Это только для тебя, неуча, это достойный вопрос. Ты сейчас похож на маленького мальчика, который "открыл", что девочки устроены не так, как мальчики и с радостным криком прибежал удивить бабушку.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.07.2023 6:04 rg45 . Предыдущая версия .
Re[15]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 06:09
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это только для тебя, неуча, это достойный вопрос. Ты сейчас похож на маленького мальчика, который "открыл", что девочки устроены не так, как мальчики и с радостным криком прибежал удивить бабушку.


Я понимаю что для вашего самолюбия такой вариант был бы идеален. Как бы раздуть свое эго за счет других.

Однако же в таком случае — вопрос бы получил ответ. Пока ответа полноценного нет.
=сначала спроси у GPT=
Re[16]: Ошибка, если конструктор определен в h-файле (этюд?)
От: so5team https://stiffstream.com
Дата: 06.07.23 06:12
Оценка: +4
Здравствуйте, Shmj, Вы писали:

S>Однако же в таком случае — вопрос бы получил ответ. Пока ответа полноценного нет.


В эту игру можно играть вдвоем: пока полноценного вопроса нет.
Re[16]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 06:15
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Однако же в таком случае — вопрос бы получил ответ. Пока ответа полноценного нет.


Ты меня на "слабо" решил пробить, что ли? Ну хорошо, что будет, если я приведу такой пример? Избавишь этот форум от своего присутствия?
--
Справедливость выше закона. А человечность выше справедливости.
Re[17]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 06:16
Оценка: :))) :))
Здравствуйте, rg45, Вы писали:

R>Ты меня на "слабо" решил пробить, что ли? Ну хорошо, что будет, если я приведу такой пример? Избавишь этот форум от своего присутствия?


Вы спасете честь форума.
=сначала спроси у GPT=
Re[18]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 06:18
Оценка:
Здравствуйте, Shmj, Вы писали:

R>>Ты меня на "слабо" решил пробить, что ли? Ну хорошо, что будет, если я приведу такой пример? Избавишь этот форум от своего присутствия?


S>Вы спасете честь форума.


А, зассал, маленький Ну вот сиди и помалкивай, значит.
--
Справедливость выше закона. А человечность выше справедливости.
Re[17]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 06:23
Оценка:
Здравствуйте, so5team, Вы писали:

S>В эту игру можно играть вдвоем: пока полноценного вопроса нет.


Кратко так:

Есть класс, который имеет декларацию в H-файле и реализацию в CPP-файле. Этот класс имеет конструктор по умолчанию (т.е. явно конструктор не объявлен и не определен). Сделайте так, чтобы при добавлении явного пустого конструктора в декларацию класса, типа такого:

MyClass(){}


— код перестал компилироваться. При этом если этот же пустой конструктор лишь декларировать в H-файле а определить в CPP-файле — то код снова должен компилироваться (иначе было бы слишком просто).
=сначала спроси у GPT=
Re[18]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 06.07.23 06:26
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Есть класс, который имеет декларацию в H-файле и реализацию в CPP-файле. Этот класс имеет конструктор по умолчанию (т.е. явно конструктор не объявлен и не определен). Сделайте так, чтобы при добавлении явного пустого конструктора в декларацию класса, типа такого:


S>
S>MyClass(){}
S>


S> — код перестал компилироваться. При этом если этот же пустой конструктор лишь декларировать в H-файле а определить в CPP-файле — то код снова должен компилироваться (иначе было бы слишком просто).


Придурок, это классическая проблема, с которой сталкивался каждый, кто использует идиoму скрытой реализации (PImpl). Это только для тебя это является открытием.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 06.07.2023 6:27 rg45 . Предыдущая версия .
Re[19]: Ошибка, если конструктор определен в h-файле (этюд?)
От: Shmj Ниоткуда  
Дата: 06.07.23 06:33
Оценка:
Здравствуйте, rg45, Вы писали:

R>Придурок, это классическая проблема, с которой сталкивался каждый, кто использует идиoму скрытой реализации (PImpl). Это только для тебя это является открытием.




Попробуйте сделать и обломитесь.
=сначала спроси у GPT=
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.