2011-03-22 127 views
0

我正在學習C++並編寫遊戲。它或多或少地是奧凱。但它越大,從依賴關係中獲得的麻煩就越多。 我該如何解決這種依賴性?2類試圖訪問其他方法,無法解決依賴

class myClass_2; 

    class myClass_1 { 
     private: 
      myClass_2 * myclass2; 
     public: 
      myClass_1() {} 
      void setUp(myClass_2 &myclass) { 
       myclass2 = &myclass; 
      } 
      void doSomething_1(){ 
       myclass2->doSomething_2(); 
      } 
    }; 

    class myClass_2 { 
     private: 
      myClass_1 * myclass1; 
     public: 
      myClass_2() {} 
      void setUp(myClass_1 &myclass) { 
         myclass1 = &myclass; 
        } 
      void doSomething_2() { 
       myclass1->doSomething_1(); 
      } 
    }; 

    int main() { 
     myClass_1 class_1; 
     myClass_2 class_2; 
     class_1.setUp(class_2); 
     class_2.setUp(class_1); 
     return 1; 
    } 
+0

我希望你在真實代碼中沒有像這樣做過嗎?我的意思是,如果你打電話給「doSomething_1 | 2」,你會得到一個SO。如果你有循環依賴,我建議你看看你的設計... – Nim 2011-03-22 12:20:41

+0

我是。我還能如何讓主要類與程序的不同部分一起工作來在主題自我之間進行交互。我有MapGrid類。管理地圖和它的一切。它在每個地圖方塊中存儲單位的ID號。然後我有一個單位工廠來控制與單位有關的所有事情。單位有id。當我創建一個新單元時,我需要將ID,x,y座標傳遞給mapGrid,以便它可以更新地圖。當我說殺死x,y座標MapGrid中的一切,我需要告訴UnitFactory殺死這些ID在x,y位置的單位 – martins 2011-03-22 12:35:40

+0

爲什麼某些「工廠」需要保持它創建的狀態?當然,一旦工廠創建了這個項目,管理該實例的生命週期還有其他事情要做?所以從你的評論中,我收集到的是工廠創建單元,並且mapgrid應該管理它的生命週期,爲什麼需要知道(或關心)另一個? – Nim 2011-03-22 13:03:36

回答

1

您需要在頭文件中定義您的類,並在cpp文件中定義成員函數。

//class1.h 
class myClass_2; 
class myClass_1 { 
    private: 
     myClass_2 * myclass2; 
    public: 
     myClass_1(); 
     void setUp(myClass_2 &myclass); 
     void doSomething_1(); 
}; 


//class1.cpp 
#include "class1.h" 
#include "class2.h" 

myClass_1::myClass_1() { 
} 

void myClass_1::setUp(myClass_2 &myclass) { 
    myclass2 = &myclass; 
} 

void myClass_1::doSomething_1() { 
    myclass2->doSomething_2(); 
} 

然後對myClass_2也做同樣的事情。你不需要myClass_2的成員函數定義,以便調用成員函數,你只需要在class2.h

+0

像這樣我會有很多.cpp文件。我該如何讓編譯器理解它應該將它們放在一起的順序?因爲每個單獨的文件將只有標題 – martins 2011-03-22 12:22:46

+0

編譯的順序並不重要。頭文件基本上說「一個類存在,它看起來像這樣」,cpp文件提供了這些類的實際代碼。鏈接器處理其餘部分。 – Erik 2011-03-22 12:25:02

+0

所以我可以像這樣基本編譯。 「g ++ main.cpp something.cpp /something/something.cpp -o myProgram」。如果它那樣不會那個字符串變得巨大和難以管理? – martins 2011-03-22 12:39:10

2

發現定義你需要的類定義在頭文件分開(與.h擴展)和一個源文件(.cpp.cc文件)。然後使用#include來包含頭文件來解決這些類型的問題。請參閱此鏈接以獲得更詳細的解釋:Header files in C++

0

我希望你說過你得到了什麼麻煩。

如果麻煩的是,它不能編譯myClass_1::doSomething1(),因爲它不知道該怎麼稱呼myclass2->doSomething2(),解決的辦法是移動的myClass_1::doSomething1()定義myclass_2定義如下:

class MyClass_1 { 
    ... 
    void doSomething_1(); // just declare it here 
    ... 
} 

class My_Class_2 { 
    ... 
    void doSomething_2(); 
    ... 
} 

void MyClass_1::doSomething_1()  // now define it 
{ 
    myclass2->doSomething_2(); 
} 
1

移動班級機構之外的職能機構。

class myClass_2; 

class myClass_1 { 
    private: 
     myClass_2 * myclass2; 
    public: 
     myClass_1() {} 
     void setUp(myClass_2 &myclass); 
     void doSomething_1(); 
}; 

class myClass_2 { 
    private: 
     myClass_1 * myclass1; 
    public: 
     myClass_2() {} 
     void setUp(myClass_1 &myclass); 
     void doSomething_2(); 
}; 

void myClass_1::setUp(myClass_2 &myclass) { 
    myclass2 = &myclass; 
} 
void myClass_1::doSomething_1(){ 
    myclass2->doSomething_2(); 
} 

void myClass_2::setUp(myClass_1 &myclass) { 
    myclass1 = &myclass; 
} 
void myClass_2::doSomething_2() { 
    myclass1->doSomething_1(); 
} 

int main() { 
    myClass_1 class_1; 
    myClass_2 class_2; 
    class_1.setUp(class_2); 
    class_2.setUp(class_1); 
    return 1; 
} 

在專業的面向對象的編程類函數聲明和定義通常保存在單獨的* .h和* .cpp文件。然後* .h文件包含在主文件中。