2016-06-29 3 views
0

Я знаю два способа объявления неучтенного класса внутри тела класса.Как переадресовать неустановленный класс в тело класса без поддержки или объявления указателя

Первый является:

class A 
{ 
    friend class B; // B is forward-declared + friend 
}; 

И второе:

class A 
{ 
    class B* ptr; // B is forward-declared + pointer 
}; 

Можно вперед-объявить класс вне тела класса, но по какой-либо причине давайте забудем об этом варианте;

Итак, я хотел бы сделать возможным объявить такой член:

class A 
{ 
    /* somehow declare B in the body*/ 
    B* getInstanceB(); 
}; 

Стоит отметить, что: С объявить указатель:

class A 
{ 
    class B* pointer; 
    B* getInstanceB(); //fine 
}; 

С другим объявлением:

class A 
{ 
    friend class B; 
    B* getInstanceB(); //GCC 5.3.0 issues error, MSVC compiles 
}; 

Я глубоко сожалею, что такого синтаксиса форвардного объявления нет :

class ::[optional-namespace::]ClassName;

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

+3

Что случилось с вперед объявляя 'b' вне' Ā'? – erenon

+0

@erenon Нет ничего плохого. Но если есть еще одна возможность, я бы с удовольствием это узнал :) – xinaiz

+0

Позвольте мне получить это.Вы пытаетесь выяснить, существует ли другое решение проблемы, когда существует существующее решение, и оно работает нормально. –

ответ

2

Направить-объявляете класс с именем B внутри определения класса из A без этот класс будет вложен в A, вы можете сделать что-то вроде следующего:

class A { 
    typedef class B B; 
    // do something with B 
}; 

Объяснение можно найти here.

Демонстрация того, что это на самом деле делает работу: http://coliru.stacked-crooked.com/a/27913ce45a572d36

+0

Не соответствует ли это эквиваленту объявлению вперед? (Test put 'B * ptr;' прямо после класса A) –

+0

@ DieterLücking OP хочет, чтобы переднее объявление находилось внутри определения класса 'A'. – Brian

0

Итак, что вы пытаетесь сделать, это иметь экземпляр класса внутри другого класса, но иметь определение после «контейнерного класса»?

//forward declaration of B 
class B; 

class A 
{ 
    public: 
    B* getInstanceB(); 

    private: 
    B b_; 

}; 

B* A::getInstanceB() 
{ 
    return &b_; 
} 

//implementation of B 
class B{}; 

вот так?

НТН

+0

Нет, этого я и хотел избежать в этом примере. Речь идет о передовом объявлении класса B внутри класса A, а не снаружи. – xinaiz

+0

хорошо, вы могли бы просто сделать оператор пространства имен внутри вашего класса A см .: http://www.cplusplus.com/doc/tutorial/namespaces/ – jaaq

0

Я глубоко сожалею, что не существует такого прямой объявляя синтаксиса как:

class ::[optional-namespace::]ClassName; 

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

Нет, я не думаю, что есть.

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

  • Нет связанных вопросов^_^