我正在学习c ++并编写游戏。它或多或少变得越来越好。但它越大,从依赖关系中获得的麻烦越多。 我该如何解决这种依赖?
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 :(得分:2)
您需要在头文件(带有.h
扩展名)和源文件(.cpp
或.cc
文件)中分隔类定义。然后使用#include
包含头文件来解决这些类型的问题。有关更详细的说明,请参阅此链接:Header files in C++
答案 1 :(得分: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
答案 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文件包含在主文件中。
答案 3 :(得分: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();
}