2011-03-22 46 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文件包含在主文件中。