2015-01-09 2 views
0

У меня есть следующие два класса.Запретить пользователям создавать объекты, но допускать некоторые классы

Class A 
{ 
    proctected: 
     A(){} 
}; 

Class B 
{ 
    push_new_A_into_v(); 
    vector<A> v;  
}; 

Функция

push_new_A_into_v();

не будет компилироваться, так как конструктор A защищен. Сделать B наследовать от A не поможет, так как метод создает совершенно новый A (Why is protected constructor raising an error this this code?).

Причина конструктор защищена, чтобы заставить пользователей не может создать объект типа А.

Как я могу сделать это возможным метод работы в то время как пользователи по-прежнему не в состоянии создать объекты типа А?

+0

Сделать класс B другом? –

+0

'proctected:' должен быть 'protected:' – HolyBlackCat

+0

Зачем вам нужен конструктор для защиты? Вам это нужно как абстрактный класс? или вы просто хотите контролировать, кто к нему обращается? – Pedrom

ответ

4

В дополнение к user2913094's answer:

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

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

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

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

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

+0

Он отлично поработал, пока мне не понадобилось иметь A в паре. Тогда для класса A нужен конструктор по умолчанию! –

2
class A { 
    friend class B; 
    ... 
+0

Я слышал, что этого друга следует избегать, но, возможно, я ошибаюсь! Если я делаю B другом, тогда все в классе A может быть частным, а не защищенным? –

+0

обязательно подумайте о том, чтобы сделать конструктор приватным, если это возможно - поскольку это предотвращает создание производного класса A. Однако отношения «друг» полностью доверяют. B мог бы видеть в A. Если это нежелательно, см. Другой ответ - маркер конструкции, связывающий только конкретный конструктор от A до B. –

+0

@ user1991779 Ключевое слово friend разбивает модификатор доступа, добавляя исключения и пуристы OO-программисты пропагандировать, чтобы не использовать его. Дискуссия о том, будет ли использование этого или нет, будет аналогична использованию goto. Мое личное дело в том, что, если вы знаете, что делаете, просто используйте его :) – Pedrom

Смежные вопросы