2013-11-24 93 views
1

我想要訪問一個變量,它位於父類(TestClassOne.h)內部的一個對象(TestClassThree.h)中。每個類都在自己的文件中,當我嘗試導入文件以實例化它崩潰的類時。我懷疑這是因爲導入循環。我不認爲我可以使用前向類聲明,因爲這會限制對變量的訪問。我如何從TestClassTwo訪問TestClassTree中的變量?在C++中訪問一個姐妹對象的成員變量

//--TestClassOne.h-- 
#include "TestClassTwo.h" 
#include "TestClassThree.h" 

class TestClassOne { 
public: 
    TestClassTwo *myVariable; 
    TestClassThree *mySecondVariable; 

    TestClassOne() { 
     myVariable = new TestClassTwo(this); 
     mySecondVariable = new TestClassThree(); 
    } 
}; 

//--TestClassTwo.h-- 
#include "TestClassOne.h" //<-- ERROR 

class TestClassTwo { 
public: 
    TestClassOne *parent; 

    TestClassTwo(TestClassOne *_parent) : parent(_parent) { 

    } 

    void setValue() { 
     parent->mySecondVariable->mySecondVariable->value = 10; 
    } 

}; 
+2

大概當你說「崩潰」你真的是指「我得到一個編譯器錯誤信息」? –

+0

我不認爲你可以同時在a.h中的b.h和b.h中包含a.h。這將導致無限的深度依賴。 –

+0

是的,編譯器抱怨。 – Sosumi

回答

1

可以使用forward class declarationsfriend關鍵字

+0

我不認爲他需要朋友,因爲所有的班級成員都是公開的 – Laurent

1

嘗試添加所謂的包括警衛(參見this SO question)。在TestClassOne.h添加以下行的文件的頂部和底部:

#ifndef TESTCLASSONE_H 
#define TESTCLASSONE_H 

[...] 

#endif 

也加入這TestClassTwo.h,但改變預處理器宏TESTCLASSTWO_H的名稱。

0

無論什麼說herzbube和市馬鈴薯回答你的問題:

1 - 避免「包括循環」使用的#ifndef/#define宏就像herzbube解釋

2 - 使用着類聲明告訴編譯器一個類將被定義後

// 1- avoid "include loops" 
#ifndef TESTCLASSONE_H 
#define TESTCLASSONE_H 

// 2- Forward classes declarations 
class TestClassTwo; 
class TestClassThree; // assuming TestClassThree needs TestClassOne.h 

class TestClassOne{ 
... 
}; 
#endif