У меня есть следующие два класса.
Class A
{
proctected:
A(){}
};
Class B
{
push_new_A_into_v();
vector<A> v;
};
Функция
push_new_A_into_v();
не будет компилироваться, поскольку конструктор защищен. Сделать B наследовать от A не поможет, поскольку метод создает совершенно новый A (почему защищенный конструктор создает ошибку этого кода?).
Причина, по которой конструктор A защищен, заключается в том, чтобы сделать пользователей неспособными создать объект типа A.
Как я могу заставить этот метод работать, пока пользователи все еще не могут создавать объекты типа A?
В дополнение к user2913094 ответ:
Если дать B
полную дружбу, чтобы разрешить строительство, кажется неприемлемым, вы можете добавить конструктор, для которого требуется конструкционный токен, который может быть получен только B
:
class A {
public:
class ConstructionToken {
private:
ConstructionToken();
friend class B;
};
A(ConstructionToken const&);
protected:
A();
};
Обратите внимание, что маркер класс совершенно пуст, но так как только B
может получить доступ к своему частному конструктору, что существенно препятствует пользователю вызова A
открытый конструктору напрямую.
Это позволяет использовать более мелкозернистый контроль доступа, но имеет тот недостаток, что для этого требуется ввести дополнительную конструкторскую перегрузку на A
class A {
friend class B;
...
friend
полностью доверяет. B сможет увидеть A. Если это не нужно, см. Другой ответ - маркер конструкции, связывающий только конкретный конструктор A с B.
proctected:
должны бытьprotected: