2010-12-11 2 views
1

Я кодирую в C++, и у меня есть личные члены данных в файле заголовка класса.Проблема инициализации объекта в файле заголовка C++

private: 
     Object1 obj1; 
     Object2 obj2(&obj1); 

Таким образом, второй объект принимает указатель на первый объект. Когда я пытаюсь скомпилировать программу, я получаю следующее сообщение об ошибке:

«ожидаемый идентификатора перед„&“маркера»

Есть ли способ для создания экземпляра объектов внутри этого класса конструктором в файле реализации а не его определение? Как исправить эту ошибку? Программа не будет компилироваться.

ответ

1

То, что ваш компилятор говорит вам с этой ошибкой, - это th при этом вы пытаетесь сделать метод с именем obj2, возвращая Object2, который принимает ссылку в качестве параметра. Но он не может понять, каков тип ссылки.

С другой стороны, если вы хотите установить ссылку до построения объекта вы можете написать что-то вроде этого:

Object2* obj2 = &obj1; 

Редактировать

How do I correct this error? The program won't compile.

Оформление вашей программы компиляция не всегда является лучшим решением, возможно, есть причина, почему она не будет компилироваться, и вы должны понять, почему это так. Простое исправление ошибки может не помочь вашему делу. Как отметил Наваз в комментарии, если типы Object1 и Object2 отличаются друг от друга, возможно, что вы пытаетесь сделать это неправильно.

+0

Спасибо.Это поставило проблему. – user246392

+0

Ваше приветствие, если это решило вашу проблему, отметьте как ответ. – ALOToverflow

+0

... что, если 'Object2' полностью отличается от' Object1'? – Nawaz

1

Вы не можете написать так:

Object2 obj2(&obj1); 

Используйте конструктор для инициализации объектов, например:

class Sample 
{ 
private: 
     Object1 obj1; 
     Object2 obj2; 
public: 
    Sample(Object1 o1) : obj1(o1), obj2(&o1) 
    { 
    } 
}; 

Прочитайте это, чтобы понять это в деталях:

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

+0

Затем, как передать указатель на obj2 внутри заголовка? – user246392

+0

У вас нет, если вы не определяете тело конструктора в заголовке, что обычно не рекомендуется. – suszterpatt

+0

Компилятор уже сказал ему об этом. Почему бы ему не сказать, почему он не может? –

2

В C++ вы не можете инициализировать элементы как часть определения класса. Такого рода операции должно быть сделано в конструкторе:

myClass() : obj2(& (this->obj1)) { ... } 

Это обычно генерирует предупреждение, но будет хорошо, пока obj2 не использует свой аргумент конструктора до построения myClass завершена.

0

Вы не можете назначать значения таким членам в объявлении. Вы должны сделать это в конструкторе класса.

MyClass 
{ 
    private: 
     Object1 obj1; 
     Object2 obj2; 

    public: 
     MyClass() 
     { 
      obj2 = Object2(&obj1); 
     } 
}; 
+4

Это не удастся, если Object2 не имеет конструктора по умолчанию. И инициализирует его дважды, если это произойдет. –