Форвардная декларация против включения

Рассмотрим следующие два сценария (отредактированы только для того, чтобы завершить весь вопрос и сделать его более понятным)

Случай 1: (не компилируется, как правильно указано ниже)

//B.h
#ifndef B_H
#define B_H
#include "B.h"

class A;

class B { 
        A obj;
        public:
        void printA_thruB();

         };  
#endif

//B.cpp
#include "B.h"
#include <iostream>

void B::printA_thruB(){
        obj.printA();
        }   


//A.h;
#ifndef A_H
#define A_H

#include "A.h"

class A { 
        int a;
        public:
        A();
        void printA();

         };  
#endif   

//A.cpp                           
#include "A.h"                    
#include <iostream>               

A::A(){                           
        a=10;                     
        }                         

void A::printA()                  
{                                 
std::cout<<"A:"<<a<<std::endl;    
}  


//main.cpp
 #include "B.h"
  #include<iostream>
 using namespace std;

 int main()
 {
 B obj;
 obj.printA_thruB();
 }

Случай 2: (единственные изменения .. .works без ошибки компиляции)

//B.h

#include "A.h" //Add this line
//class A;     //comment out this line

Предположим, что и A.cpp, и B.cpp соблюдаются вместе. Имеют ли два приведенных выше сценария какие-либо различия? Есть ли причина предпочитать один метод другому?

Редактировать: Итак, как мне заставить сценарий 1 работать.

19
задан Sii 3 September 2010 в 04:05
поделиться