Запрещать пользователям создавать объекты, но разрешать некоторые классы

0

У меня есть следующие два класса.

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?

  • 0
    Сделать класс B другом?
  • 0
    proctected: должны быть protected:
Показать ещё 2 комментария
Теги:
class
inheritance

2 ответа

4
Лучший ответ

В дополнение к user2913094 ответ:

Если дать B полную дружбу, чтобы разрешить строительство, кажется неприемлемым, вы можете добавить конструктор, для которого требуется конструкционный токен, который может быть получен только B:

class A {
public:
    class ConstructionToken {
    private:
        ConstructionToken();
        friend class B;
    };

    A(ConstructionToken const&);
protected:
    A();
};

Обратите внимание, что маркер класс совершенно пуст, но так как только B может получить доступ к своему частному конструктору, что существенно препятствует пользователю вызова A открытый конструктору напрямую.

Это позволяет использовать более мелкозернистый контроль доступа, но имеет тот недостаток, что для этого требуется ввести дополнительную конструкторскую перегрузку на A

  • 0
    Это работало отлично, пока мне не нужно было иметь А в паре. Тогда классу A нужен конструктор по умолчанию!
2
class A {
    friend class B;
    ...
  • 0
    Я слышал, что этого друга следует избегать, но, возможно, я ошибаюсь! Если я сделаю B другом, то все в классе A может быть приватным, а не защищенным?
  • 0
    конечно, если возможно, подумайте о том, чтобы сделать конструктор частным, поскольку это предотвращает создание производным классом класса A. Однако отношение « friend полностью доверяет. B сможет увидеть A. Если это не нужно, см. Другой ответ - маркер конструкции, связывающий только конкретный конструктор A с B.
Показать ещё 1 комментарий
Сообщество Overcoder
Наверх
Меню