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();
}
Другие вопросы по тегам