2015-05-02 6 views
0

Я думаю, что заголовок вопроса может оказаться невозможным, но у меня есть класс (давайте назовем его A), у которого есть конструктор, которому нужен указатель на другой класс (называемый B). Это было бы хорошо, но когда я определяю класс в третьем классе (называемый C), я получаю эту ошибку после помещения переменной в конструктор: error: expected identifier before ‘&’ token, затем, если я удалю &, я получаю: error: ‘ClassA’ is not a type.Проблемы с конструктором с классом внутри другого класса

Для тех, кто не может понять, что я только что сказал (я не виню тебя), вот пример:

class A 
{ 
    private: 
     int number; 
     //etc, etc... 
}; 

class B 
{ 
    private: 
     A* ClassAPntr; 

    public: 
     B(A* objectPointer) 
     { 
      ClassAPntr = objectPointer; 
     } 
}; 

class C 
{ 
    private: 
     A ClassA; 
     B ClassB(&ClassA); 
}; 

int main() 
{ 
    C classC; 
} 

ответ

3

Вы фактически не объявить конструктор для class C. Что ты имел в виду, чтобы сделать, это:

class C 
{ 
public: 
    C() 
    : b(&a) // you have to provide the arguments to B's constructor here 
    { } 

private: 
    A a; 
    B b; // ... not here 
}; 
+0

Спасибо, это работает отлично! Хотя это не связано с вопросом, почему мой код не работает (как, почему я не могу объявить конструкторы наедине)? Есть ли веская причина, или она может быть исправлена ​​как C++ 20 или что-то в этом роде? – bboy3577

+0

@ bboy3577 Доступ (то есть 'private') не является проблемой. Это просто синтаксически неверно. В C++ 11 появилась возможность добавлять элемент-бит-или-равный-инициализатор для нестатических членов данных, поэтому вы можете * делать 'B b {& a}' там. – Barry

0

Просто для уточнения, когда вы сделали composition путем добавления A classAprivate object в class C, компилятор принимает этот шаг, поскольку А имеет неопределенные конструктор, который означает, что компилятор сделает конструктор по умолчанию для вы и называете это, когда делаете A classA.

Проблема в class B, поскольку он имеет конструктор, не имеющий значения по умолчанию, который означает, что компилятор должен заставить вас вызвать его в классе C через список инициализации конструктора или через фигурные скобки в C++ 11, так что это станет вашей ответственностью просто потому, что компилятор не может знать, для какого адреса, для которого class A Object вы собираетесь передать для class B constructor.

Итак, почему вы получили это сообщение об ошибке: class A is not a type или expected identifier before ‘&’ token?

ответ, что компилятор считается B ClassB(&ClassA) соответствующей декларацией для private функции с именем ClassB и возвращаемым значением типа B class.

и поскольку вы никогда не используете эту функцию в своем классе, компилятор никогда не даст вам никаких ошибок, связанных с определением. и вы также никогда не использовать эту функцию в других функциях, как основные, так как это частная

для получения неопределенной ссылки ошибки вы можете изменить c class быть похожими на это:

class C 
{ 

private: 
    A classA; 
    B classB(); 
    friend B func() ; 
}; 

B func() { 
    C c; 
return c.classB(); // undefined reference Error 
} 
Смежные вопросы