2017-01-23 94 views
1

我有四個C++文件,兩個頭文件和兩個cpp文件。標題是適當的防護,並在第一個我用的是向前聲明是這樣的:在兩個頭文件和兩個cpp文件中的前向聲明

//A.h 
class B; 

class A { 
public: 
    A(); 
    void doSomething(B* b); 
}; 

一些實施:

void A::doSomething(B* b){ 
    b->add(); 
} 

另一頭如下:

#include "A.h" 
class B { 
public: 
    B(); 
    void add(); 
}; 

void B::add(){ 
    cout << "B is adding" << endl; 
} 

我得到「成員訪問不完整的類型B」的錯誤,我卡在那裏。我需要在A中使用一個Bs,每個B必須有一個指向它的「所有者」的指針,這是A的一個實例。我可以做些什麼來解決這種情況。

在此先感謝

+9

添加'#包括「B.h」'在A.cpp。 –

+0

@RSahu ..你完全正確。我只需要自己澄清一下。 Thnks –

回答

0

B.cpp文件,儘管命名類似,不會隱包括B.h。您必須包含兩個實現中的B.h。另外,如果您想包括A.hB.h,創建包括警衛

+0

我已經保護了兩個頭文件,並且肯定在B.cpp –

-1

您需要爲B類的定義,然後才能使用doSomething(B* b)方法,所以我認爲不是的:

class B; 

class A { 
public: 
    A(); 
    void doSomething(B* b); 
}; 

你需要做這樣的事情:

class B; 

class A { 
public: 
    A(); 
}; 

void A::doSomething(B* b); 

在編譯器具有它需要的關於類B(內存分配等)的信息之後聲明它。

+0

中包含了Bh,不幸的是,這會產生以下錯誤:「doSomething的超線程聲明與'A'中的任何聲明不匹配」 –

+0

您需要擁有在使用'B'之前(無論是通過聲明一個「B」類型的變量,還是使用'B'的成員),定義'B'。你只需要一個'B'的聲明來聲明一個_pointer或者一個reference_到'B'。看[這個例子](http://ideone.com/2O5qfU)。 (這是因爲需要知道'B'的成員來計算'B'的大小或者允許它們被使用,但是指針的大小一般不會被成員修改(並且引用正式不是實際的實體如同預先存在的實體的新名稱一樣,但通常通過指針來實現)。) –

0

通過在A類和B類定義(標題)中使用前向聲明並在A.cpp中包含A.h,在A.cpp中包含B.h解決了該問題。代碼如下:

//A.h 

#ifndef A_H_ 
#define A_H_ 

#include <iostream> 

using namespace std; 

class B; 

class A{ 
public: 
    A(); 
    virtual ~A(); 

private: 
    B* pToB; 

public: 
    void doSomething(B* b); 
    void SetB(B* b); 
}; 

#endif 

cpp for A class,注意包含B.H(這個通常我不會做)

// A.cpp 

#include "A.h" 
#include "B.h" 

A::A():pToB(){ 
    cout << "A constructor" << endl; 
} 

A::~A(){} 

void A::SetB(B* b){ 
    this->pToB = b; 
    cout << "setting B" << endl; 
} 

void A::doSomething(B* b){ 
cout << "A is gonna call B's method add: "; 
    b->add(); 
} 

現在的B級:

// B.h 

#ifndef B_H_ 
#define B_H_ 

#include <iostream> 

using namespace std; 

class A; 

class B{ 
public: 
    B(); 
    virtual ~B(); 

private: 
    A* pToA; 

public: 
    void add(); 
    void SetA(A* a); 
}; 

#endif 

實施對於B

// B.cpp 

#include "B.h" 
#include "A.h" 

B::B():pToA(){ 
    cout << "B constructor」 << endl; 
} 

B::~B(){} 

void B::SetA(A* a){ 
    this->pToA = a; 
    cout << "setting A" << endl; 
} 

void B::add(){ 
    cout << "B is adding" << endl; 
} 

的CPP,包括主要功能(包括標題在內,沒有不包括)

#include "A.h" 
#include "A.h" 

int main() { 
    A* newA = new A; 
    B* newB = new B; 
    newA->SetB(newB); 
    newB->SetA(newA); 
    newA->doSomething(newB); 
    return 0; 
} 

輸出這個程序是這樣的:

A constructor 
B constructor 
setting B 
setting A 
A is gonna call B's method add: B is adding 

感謝Sandeep Dattasolution幫我解決這個問題