Объявление метода C ++, проблема определения класса - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть 2 класса: A и B. Некоторые методы класса A должны использовать класс B и наоборот (у класса B есть методы, которые должны использовать класс A).

Итак, у меня есть:

class A;

class B {

   method1(A a) {
   }

}

class A {

   method1(B b) {
   }

   void foo() {
   }
}

и все работает нормально.

Но когда я пытаюсь вызвать foo () класса A из B :: method1 следующим образом:

class B {

   method1(A a) {
      a.foo();
   }

}

я получаю какрезультат компиляции ошибок предварительное объявление и использование неполного типа .Но почему это происходит?(Я объявил класс A перед его использованием?)

Ответы [ 2 ]

6 голосов
/ 28 декабря 2010

Компилятор не видел определения A в точке, где вы вызываете A::foo().Вы не можете вызвать метод для неполного типа - то есть типа, для которого компилятор еще не знает определения.Вам необходимо определить метод вызова после , когда компилятор может увидеть определение class A.

class A;

class B 
{
    public:
   void method1(A a);
};

class A 
{
    public:
   void method1(B b) { }

   void foo() { }
};

void B::method1(A a)
{
    a.foo();
}

На практике вы можете поместить определение для B::method1() вотдельный cpp файл, который имеет #include для заголовочного файла, содержащего class A.

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

C ++ INCLUDE Правило: по возможности используйте прямое объявление .

  • B использует только ссылки или указатели на A. Тогда используйте прямое объявление: вам не нужновключать .Это, в свою очередь, немного ускорит компиляцию.

  • B наследуется от A или B, явно (или косвенно) использует объекты класса A. Затем необходимо включить

Источник: http://www -subatech.in2p3.fr / ~ фотоны / subatech / soft / carnac / CPP-INC-1.shtml

Чтобы избежать многократного включения заголовочных файлов, вы должны включить охрану, чтобыне позволяйте компилятору читать определения более одного раза:

#ifndef EMCQUEUE_HH
#define EMCQUEUE_HH
// rest of header file ...
// definition code here...
#endif

См. Industrial Strength C ++ Глава вторая: Организация кода.

...