как я могу создать вектор объектов A в B [...]?
Вы не можете этого сделать. В то время как B
является friend
из A
, std::vector
является , а не a friend
из A
, что означает, что он не может получить доступ к private
членам A
, например , конструктор, который необходим для работы вектора.
Однако, если у вас все в порядке с небольшим косвенным обращением, небольшим потенциальным падением производительности и изменением вашей подписи, вы можете заменить нерабочий std::vector<A>
с рабочим std::vector<std::unique_ptr<A, deleter>>
.
Важно отметить, что обычный std::unique_ptr
здесь не будет работать. У него есть проблема, аналогичная std::vector
- он не может получить доступ к private
деструктору A
. Один из способов обойти это - передать всю работу по созданию и уничтожению A
с полностью на B
- путем явного строительства и разрушения, то есть:
new A(name, num)
static void deleter_a(A* a) { delete a; }
в области B
.
Теперь мы можем сделать:
std::vector<std::unique_ptr<A, std::function<void(A*)>>> vecA;
вместо: std::vector<A>
или std::vector<std::unique_ptr<A>>
. Это важно - ни std::unique_ptr
, ни std::vector
не создают или не разрушают ваши A
s. B
несет полную ответственность за конструирование (new A(name, num)
) и разрушение (static void deleter_a(A* a) { delete a; }
) A
с.
Полный B
класс:
class B {
public:
B() {}; // or = default
~B() {}; // or = default
void addA(const std::string name, const float num);
private:
static void deleter_a(A* a) { delete a; }
using deleter_a_t = void(A*);
std::vector<std::unique_ptr<A, std::function<deleter_a_t>>> vecA;
};
void B::addA(const std::string name, const float num) {
vecA.push_back(std::unique_ptr<A, std::function<deleter_a_t>>{
new A(name, num), std::function<deleter_a_t>{deleter_a}
});
}