Проблема инициализации объекта в заголовочном файле C ++ - PullRequest
1 голос
/ 12 декабря 2010

Я пишу в C ++, и у меня есть личные данные в заголовочном файле класса.

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

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

"ожидаемый идентификатор перед '&' token"

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

Ответы [ 4 ]

2 голосов
/ 12 декабря 2010

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

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

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

1 голос
/ 12 декабря 2010

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

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

Object2* obj2 = &obj1;

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

Как исправить эту ошибку?Программа не скомпилируется.

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

1 голос
/ 12 декабря 2010

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

 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 голосов
/ 12 декабря 2010

Нельзя назначать значения таким членам в их декларации.Вам придется сделать это в конструкторе класса.

MyClass
{
    private:
        Object1 obj1;
        Object2 obj2;

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