2014-02-18 9 views
0

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

Предположим, что у меня есть 3 класса: «A», «B» и «C».

The class "A" includes "B" and "C".

The class "B" includes "A"

The class "C" includes "A"

Пойдемте код ...

#include <iostream> 
#include <b.hpp> 
#include <c.hpp> 
class A 
{ 
public: 
    A() 
    { 
     std::cout << "Hello from A" << std::endl; 
     A a; 
     B b; 
    } 
}; 

#include <iostream> 
#include <a.hpp> 
class B 
{ 
public: 
    B() 
    { 
     std::cout << "Hello from B" << std::endl; 
    } 
}; 

#include <iostream> 
#include <a.hpp> 
class C 
{ 
public: 
    C() 
    { 
     std::cout << "Hello from C" << std::endl; 
    } 
}; 

Таким образом, все работает отлично, выход:

Hello from A Hello from B Hello from C

НО, если я могу это сделать:

#include <iostream> 
#include <a.hpp> 
#include <vector> 
class B 
{ 
public: 
    B() 
    { 
     std::cout << "Hello from B" << std::endl; 
    } 
private: 
    std::vector<A> garage; 
}; 

У меня есть каскад ошибок, включая этот (на самом деле, t он главный, из-за этого один, есть и другие):

error: 'A' was not declared in this scope

std::vector garage;

Это именно то, что я хочу, у вас есть представление о том, что я могу сделать? Спасибо.

@edit - Как ответ на @Kerrek SB

Я попытался создать отдельные файлы для каждого из них, заголовка и источников. (.hpp и .cpp), и ошибка сохраняется.

A.hpp

#ifndef A_HPP 
#define A_HPP 

#include <iostream> 
#include <B.hpp> 
#include <C.hpp> 

class A 
{ 
public: 
    A(); 
}; 

#endif 

a.cpp

#include <A.hpp> 

A::A() 
{ 
    std::cout << "Hello from A" << std::endl; 
    B b; 
    C c; 
} 

B.hpp

#ifndef B_HPP 
#define B_HPP 

#include <iostream> 
#include <A.hpp> 
#include <vector> 

class B 
{ 
public: 
    B(); 
private: 
    std::vector<A> garage; 
}; 

#endif 

B.cpp

#include <B.hpp> 

B::B() 
{ 
    std::cout << "Hello from B" << std::endl; 
} 

C.hpp

#ifndef C_HPP 
#define C_HPP 

#include <iostream> 
#include <A.hpp> 

class C 
{ 
public: 
    C(); 
}; 

#endif 

C.cpp

#include <C.hpp> 

C::C() 
{ 
    std::cout << "Hello from C" << std::endl; 
} 

main.cpp

#include <iostream> 
#include <A.hpp> 

int main(int argc, char ** argv) 
{ 
    A a; 
    return 0; 
} 

GCC

g++ -O2 -std=c++11 -I"." -o exchange A.cpp B.cpp C.cpp main.cpp

выход

In file included from ./A.hpp:5:0,

   from ./C.hpp:5, 

      from C.cpp:1: 

./B.hpp:13:17: error: 'A' was not declared in this scope

std::vector<A> garage; 
+0

у вас есть #include в вашем фактическом коде? – suspectus

+0

Да, я это сделал, это была ошибка. –

ответ

3

Отдельные определения класса из определений членов класса:

#include <iostream> 
#include <vector> 

class A { public: A(); }; 
class B { public: B(); private: std::vector<A> garage; }; 
class C { public: C(); }; 

A::A() 
{ 
    std::cout << "Hello from A" << std::endl; 
    // A a; // no, because that's idiotic 
    B b; 
} 

B::B() 
{ 
    std::cout << "Hello from B" << std::endl; 
} 

C::C() 
{ 
    std::cout << "Hello from C" << std::endl; 
} 

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

+0

Я попытался создать отдельные файлы, см. Мой @edit выше. - Спасибо. –

+0

@ SH.0x90: Исправьте ваши включенные. Включите только то, что вам нужно в заголовках, и включите остальные в исходные файлы. (В частности, исправить A.hpp и A.cpp.) –

+0

Я удалил включения «B» и «C» «A.hpp» и надел «A.cpp», но я получил эту ошибку: main. cpp :(text.startup + 0x13): неопределенная ссылка на 'A :: A() –

Смежные вопросы