Класс с передачей по ссылке дает ошибку компиляции - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть класс A, определенный в отдельном заголовочном файле. Я хочу, чтобы класс B имел ссылку на объект класса A, сохраненный как переменная.

Как это:

Файл: A.h

class A {
    //Header for class A...
};

Файл: B.h

#include "A.h"
class B {
    private:
(24)        A &variableName;
    public:
(36)        B(A &varName);
};

Когда я пытаюсь скомпилировать его с помощью g ++, я получаю следующую ошибку:

B.h:24: error: ‘A’ does not name a type
B.h:36: error: expected `)' before ‘&’ token

Есть предложения, что я делаю не так? Если это имеет значение, класс A является абстрактным классом.

РЕДАКТИРОВАТЬ: Некоторые опечатки в коде

Ответы [ 5 ]

3 голосов
/ 24 февраля 2010

По мне это компилируется нормально (как и ожидалось). Я предполагаю, что A.h не включен должным образом. Есть ли другой файл с тем же именем, который включается вместо? Возможно, есть #ifdef s или некоторые другие, которые мешают компилятору видеть определение A. Чтобы проверить это, я бы поместил какую-то синтаксическую ошибку в A.h и посмотрел, ловит ли ее компилятор.

1 голос
/ 24 февраля 2010

Включает ли A.h B.h (прямо или косвенно)? Если это так, то вы не сможете определить A до B из-за рекурсивных включений. Если B необходимо определить в A, используйте предварительное объявление .

0 голосов
/ 24 февраля 2010

Насколько я вижу, этот код правильный. Проверьте следующее, пожалуйста:

  • находится в некотором пространстве имен?
  • является ли вложенным классом?
  • является ли имя какого-либо макроса в вашем коде?
  • действительно ли A называется A, или в вашем реальном коде есть опечатка?

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

0 голосов
/ 24 февраля 2010

Обратите внимание, что наличие ссылок в качестве переменных-членов редко является хорошей идеей. Что в действительности означает имя B?

0 голосов
/ 24 февраля 2010

Вы, кажется, пытаетесь объявить конструктор для класса A внутри совершенно не связанного класса B, на что жалуется компилятор.

Если вы хотите иметь по умолчанию / неявный способ превращения B в A с точки зрения компилятора, вам понадобится что-то вроде

operator A(B const &var);

вместо объявления конструктора.

...