Size: a a a

2020 March 17

IZ

Ilia Zviagin in pro.cxx
Alex
Вот с деструктором непонятно, почему дефолтный прокатил. Потому что родительский объект разрушается только из .срр, где уже доступно полное объявление value_type?
Так а ты какое объявление делал?
источник

АК

Александр Караев in pro.cxx
Ilia Zviagin
Ну, я вообще-то не это имел в виду, автор там хотел полиморфные контейнеры получить.

Но что такое может компилироваться, я тоже не думал.
Хм, не увидел там упоминания полиморфности
источник

АК

Александр Караев in pro.cxx
Alexander N
Как это вообще работает?
Что именно?
источник

IZ

Ilia Zviagin in pro.cxx
Александр Караев
Хм, не увидел там упоминания полиморфности
Мда, действительно. Это у меня ложная память.
источник

A

Alex in pro.cxx
Ilia Zviagin
Так а ты какое объявление делал?
class Contained;

class A {
A();
std::vector<Contained> _container;
};

class Contained {};
источник

A

Alex in pro.cxx
мне нужно было отвязать хедер класса А от хедера класса Contained, если бы это не работало - пришлось бы городить PIMPL и лишнее динамическое выделение на ровном месте.
источник

AZ

Alexander Zaitsev in pro.cxx
Alex
class Contained;

class A {
A();
std::vector<Contained> _container;
};

class Contained {};
а почему нельзя сделать, чтобы Contained был выше?
источник

A

Alex in pro.cxx
Можно, но тогда проблемы с архитектурой и просачиванием деталей реализации на верхний уровень, где их быть не должно. Ведь контейнер - это тоже подробность реализации класса, а так проекту более высокого уровня (клиенту класса А) нужно было бы видеть класс Contained, который ещё на уровень ниже и вообще из другой библиотеки.
источник

AZ

Alexander Zaitsev in pro.cxx
нужно == просто протекал бы через инклуды?
источник

A

Alex in pro.cxx
да
источник

AZ

Alexander Zaitsev in pro.cxx
понял-принял :)
источник

A

Alex in pro.cxx
линковать, конечно, не нужно, а вот хедер видеть нужно, мне это не понравилось
источник

AS

Anatoly Shirokov in pro.cxx
Alex
линковать, конечно, не нужно, а вот хедер видеть нужно, мне это не понравилось
pimpl тогда?
источник

A

Alex in pro.cxx
да, уже начал наворачивать, и тут выяснилось, что есть способ намного проще
источник

A

Alex in pro.cxx
лишнюю индирекцию тоже не хочется, если можно обойтись без
источник

АК

Александр Караев in pro.cxx
Alex
лишнюю индирекцию тоже не хочется, если можно обойтись без
ну, вектор - уже лишняя
источник

A

Alex in pro.cxx
в данном случае не лишняя, а необходимая, размер динамический нужен
источник

V

Vyacheslav in pro.cxx
Alex
ну то есть прокатило потому, что место использования - это .срр, где все типы complete
Для перечисленных мной типов важна только доступность полного объявления в момент разрушения контейнера. Для вектора полное объявление нужно при любых операциях (кроме взятия длины и проверки на пустоту). Даже поиск по ключу в мапе будет работать без полного объявления, вот только что потом с полученным итератором делать - хз
источник

V

Vyacheslav in pro.cxx
Александр Караев
struct A;
struct B { std::vector<A> a; };

Или даже...
struct B { std::vector<B> b; };
В первом случае любой B b; (без ранее объявленного A) завалит сборку. А так, можно конечно
источник

АК

Александр Караев in pro.cxx
Vyacheslav
В первом случае любой B b; (без ранее объявленного A) завалит сборку. А так, можно конечно
#include <A.h>
B b;
не завалит
#include <A.h>
B b;
не завалит
именно так
источник