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;
}
4 ответа
Вы должны отделить определение класса в заголовочном файле (с помощью .h
расширение) и исходный файл (.cpp
или же .cc
файл). А потом использовать #include
включить файл заголовка для решения этих типов проблем. Смотрите эту ссылку для более подробного объяснения: Заголовочные файлы в C++
Вы должны определить свои классы в заголовочных файлах и определить функции-члены в файлах 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
Переместите функциональные тела за пределы классов.
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 включается в основной файл.
Хотел бы я, чтобы ты сказал, какие проблемы у тебя были.
Если проблема в том, что он не может скомпилировать 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();
}