2013-11-07 4 views
0

У меня есть два класса вложенных следующим образом:Возвращение объекта вложенного класса

class A{ 
    private: 
     class B{ 

     }; 
    B *object; 
} 

теперь я хочу иметь функцию, которая может возвращать этот объект, что-то вроде:

B& A::get_object(){ 
    if(object == nullptr) 
     object = new B(); 
    return *object; 
} 

но это говорит, что B не называет тип в get_object(). Что я сделал не так, как я могу его исправить?

Основная цель, которую я делаю, заключается в том, что я хочу скрыть класс B в том, что вы не можете создать объект B любым другим способом, чем при вызове A :: get_object(). Может быть, я должен сделать это по-другому?

Заранее благодарен!

+0

Я думаю, что он должен быть полностью квалифицированным. 'A :: B &' – clcto

ответ

1

Попробуйте вернуть тип метода как A::B&.

Вы можете уйти без полного определения типа возврата в декларации класса, но не в реализации - что может показаться вводящим в заблуждение.

Кроме того, по мере того, как вы возвращаете ссылку, вам нужно позаботиться о том, чтобы B* object НИКОГДА не был нулевым - обычно путем установки его в конструктор и удаления его только в destuctor, иначе этот метод мог бы вернуть ссылку на ноль.

Если объект должен проживать до тех пор, пока он является родительским объектом, почему бы не поместить его в стек - либо это, либо метод возвращает B*.

+0

Не позаботился ли о методе get_object()? Я устанавливаю objec в nullptr в конструкторе и удаляю его в деструкторе. Кроме того, как мне отключить возможность создания объекта класса B где-то еще? Должен ли я просто объявлять конструкторы & CC с ключевым словом delete? – darenn

+0

Это, но если вы поместите объект в стек, вам не нужно будет заботиться об этом. Если, однако, это дорогостоящий объект, который не всегда может быть создан в прогоне программы, тогда его создание только по запросу является допустимым подходом. –

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