S>Я думал что эти два куска кода эквивалентны — что может сломать перенос пустого конструктора в h-файл?
Да — они эквивалентны, и причем здесь это?
какая буква в словосочетании "incomplete type" не ясна?
заголовок с типом class2 добавлен в .cpp но не в .h, либо не добавлен но имеет с ним циклическую зависимость
Так будет с каждым кто не понимает зачем c++ разделяет определения и имплементации.
Re[6]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Teolog, Вы писали:
T>Да — они эквивалентны, и причем здесь это? T>какая буква в словосочетании "incomplete type" не ясна? T>заголовок с типом class2 добавлен в .cpp но не в .h, либо не добавлен но имеет с ним циклическую зависимость T>Так будет с каждым кто не понимает зачем c++ разделяет определения и имплементации.
А теперь закрепите это примером, который демонстрирует данное поведение.
=сначала спроси у GPT=
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, 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-файле (этюд?)
Здравствуйте, 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.cpp#include"test.hpp"class Class2 {}; // полное определение нужно в любом случае
Class1::~Class1() = default; // достаточно сгенерированной версии, главное чтобы Class2 был здесь доступен
Re[13]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, rg45, Вы писали:
S>>А вот оно видите как — нужно смотреть на суть. R>На твою суть я тут уже насмотрелся предостаточно.
Ты зацикливаешься на человеке. Как видишь — это глупо, т.к. человек всего лишь сосуд — он наполняется разной инфой и его содержимое постоянно изменяется.
Уже много месяцев на форуме не было достойного вопроса. И вот, наконец, такой вопрос появился.
=сначала спроси у GPT=
Re[7]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Вопрос то тянет на этюд — никто из "знатоков" так и не смог ответить.
Какой же вы молодец, уели целый форум! Так нам и надо!
S>Возможно придется мне на выходных найти время и таки выцедить минимальный пример (надеюсь что нет).
Страшно представить, на какие лишения вы вынуждены будете пойти, чтобы уговорить RSDN дать ответ на ваш вопрос...
Re[9]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, PM, Вы писали:
PM>Исправление — объявить деструктор в классе, определить в реализации:
error: invalid application of 'sizeof' to an incomplete type 'Class2'
static_assert(sizeof(_Tp) > 0,
^~~~~~~~~~~
Это в вашем оригинальном коде — с конструктором по умолчанию. А по условию задачи должно компилироваться и ломаться если конструктор явно реализовать в H-файле.
=сначала спроси у GPT=
Re[8]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, 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-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
S>Уже много месяцев на форуме не было достойного вопроса. И вот, наконец, такой вопрос появился.
Это только для тебя, неуча, это достойный вопрос. Ты сейчас похож на маленького мальчика, который "открыл", что девочки устроены не так, как мальчики и с радостным криком прибежал удивить бабушку.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Это только для тебя, неуча, это достойный вопрос. Ты сейчас похож на маленького мальчика, который "открыл", что девочки устроены не так, как мальчики и с радостным криком прибежал удивить бабушку.
Я понимаю что для вашего самолюбия такой вариант был бы идеален. Как бы раздуть свое эго за счет других.
Однако же в таком случае — вопрос бы получил ответ. Пока ответа полноценного нет.
=сначала спроси у GPT=
Re[16]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, rg45, Вы писали:
R>Ты меня на "слабо" решил пробить, что ли? Ну хорошо, что будет, если я приведу такой пример? Избавишь этот форум от своего присутствия?
Вы спасете честь форума.
=сначала спроси у GPT=
Re[18]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, Shmj, Вы писали:
R>>Ты меня на "слабо" решил пробить, что ли? Ну хорошо, что будет, если я приведу такой пример? Избавишь этот форум от своего присутствия?
S>Вы спасете честь форума.
А, зассал, маленький Ну вот сиди и помалкивай, значит.
--
Справедливость выше закона. А человечность выше справедливости.
Re[17]: Ошибка, если конструктор определен в h-файле (этюд?)
Здравствуйте, so5team, Вы писали:
S>В эту игру можно играть вдвоем: пока полноценного вопроса нет.
Кратко так:
Есть класс, который имеет декларацию в H-файле и реализацию в CPP-файле. Этот класс имеет конструктор по умолчанию (т.е. явно конструктор не объявлен и не определен). Сделайте так, чтобы при добавлении явного пустого конструктора в декларацию класса, типа такого:
MyClass(){}
— код перестал компилироваться. При этом если этот же пустой конструктор лишь декларировать в H-файле а определить в CPP-файле — то код снова должен компилироваться (иначе было бы слишком просто).
=сначала спроси у GPT=
Re[18]: Ошибка, если конструктор определен в h-файле (этюд?)
S>Есть класс, который имеет декларацию в H-файле и реализацию в CPP-файле. Этот класс имеет конструктор по умолчанию (т.е. явно конструктор не объявлен и не определен). Сделайте так, чтобы при добавлении явного пустого конструктора в декларацию класса, типа такого:
S>
S>MyClass(){}
S>
S> — код перестал компилироваться. При этом если этот же пустой конструктор лишь декларировать в H-файле а определить в CPP-файле — то код снова должен компилироваться (иначе было бы слишком просто).
Придурок, это классическая проблема, с которой сталкивался каждый, кто использует идиoму скрытой реализации (PImpl). Это только для тебя это является открытием.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>Придурок, это классическая проблема, с которой сталкивался каждый, кто использует идиoму скрытой реализации (PImpl). Это только для тебя это является открытием.