2017-07-18 97 views
0

我擁有的是2類:C++嵌套類實例

A.H:

#include "B.h" 
class A 
{ 
    vector<B*> arr; 
    void Update(int32 id){...}; 
} 

B.h

#include "A.h" 
class B 
{ 
    int32 id; 
    A* parent; 
    void OnRemove() 
    { 
     ... 
     parent->Update(id); 
    } 
} 

有了這個邏輯一切都如預期必須正常工作。 但它loop include不是因爲:A.h包括B.hB.h包括A.h

的問題是如何使它與代碼或其他結構的工作。

應該存在的主要功能是在保存B對象的對象中調用事件。

每一個幫助將不勝感激。

+2

不是100%肯定,但看起來這是一個傻瓜:HTTPS:/ /stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies – NathanOliver

回答

1

正向聲明class A;B.hclass B;A.H

你應該再往前的onRemove()的實施B.cpp,包括A.H這裏。

也不要忘記你的包括警衛。例如:

#ifndef _A_H_ 
#define _A_H_ 

class B; 

class A { 

}; 

#endif 

的包括防護裝置也可以通過#pragma once在報頭開始時所取代,這是有點更簡潔。

編輯

是完整的:

// A.h 

#pragma once 

#include <vector> 

class B; 
class A { 
    std::vector<B*> arr; 

public: 
    void Update(int32 id);   
}; 

// A.cpp 

#include "A.h" 

// possibly #include "B.h" if necessary 

void A::Update(int32 id) { 
    // impl ... 
} 

// B.h 

#pragma once 

class A; 
class B 
{ 
    int32 id; 
    A* parent; 

public: 
    void OnRemove(); 
}; 

// B.cpp 

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

void B::OnRemove() { 
    parent->Update(id); 
} 

那麼,這樣的事情...

+0

謝謝你的完整答案。 – Alxspb

1

通常的方法是在需要時提供護衛宏來防止遞歸和在一個單獨的文件移動的功能定義:

#ifndef _A_H_ 
#define _A_H_ 
#include "B.h" 
class A 
{ 
    vector<B*> arr; 
    void Update(int32 id){...}; 
} 
#endif 

...

c.cpp(如有需要)

#include <a.h> 
#include <b.h> 

void B::onRemove() { 
    blahblahblah 
} 
+0

因此,使用'guarding macros'和使用'pragma once'一樣嗎? – Alxspb

+0

我應該在B.h中使用前向聲明來使'A * parent'編譯? – Alxspb

+0

以大寫字母('_A_H_')開頭的下劃線和包含兩個連續下劃線的名稱保留供實施使用。不要在你的代碼中使用它們。 –