C ++ включает и круговые зависимости - PullRequest
2 голосов
/ 31 июля 2010

ОБНОВЛЕНИЕ: Позвольте мне уточнить мои файлы и повторить мой вопрос:

main.h

#include "other.h"

class MyClass
{
    public:
    void MyMethod();
    void AnotherMethod();

    OtherClass test;
}

main.cpp

#include "main.h"

void MyClass::MyMethod()
{
    OtherClass otherTemp;     // <--- instantitate OtherClass object
    otherTemp.OtherMethod();  // <--- in this method here, is where I want to also call MyClass::AnotherMethod()
}

void MyClass::AnotherMethod()
{
    // Some code
}

other.h

class OtherClass
{
    public:
    void OtherMethod();
}

other.cpp

#include "other.h"
void OtherClass::OtherMethod()
{
    // !!!! This is where I want to access MyClass::AnotherMethod(). How do I do it?
    // I can't just instantiate another MyClass object can I? Because if you look above in 
    // main.cpp, this method (OtherClass::OtherMethod()) was called from within
    // MyClass::MyMethod() already.
}

В общем, я хочу вот что: вы создаете объект A, который, в свою очередь, создает объект B, которыйв свою очередь вызывает метод из объекта А. Я уверен, что нечто подобное возможно, но это может быть просто плохой дизайн с моей стороны.Любое направление будет с благодарностью.

Ответы [ 4 ]

3 голосов
/ 31 июля 2010

Некоторые делают по одному .h / .cpp на класс:

my.h

#ifndef MY_H
#define MY_H
#include "other.h"
class MyClass
{
    public:
    void MyMethod();

    OtherClass test;
}
#endif // MY_H

other.h

#ifndef OTHER_H
#define OTHER_H
class OtherClass
{
    public:
    void Othermethod();
}
#endif // OTHER_H

my.cpp

#include "my.h"
void MyClass::MyMethod() { }

other.cpp

#include "other.h"
#include "my.h"
void OtherClass::OtherMethod)()
{
   // (ab)using MyClass...
}

Если вы используете только Visual Studio, вы можете использовать #pragma once вместо #ifndef xx_h #define xx_h #endif // xx_h.РЕДАКТИРОВАТЬ: как говорится в комментарии, а также соответствующая страница Википедии , #pragma once также поддерживается (по крайней мере) GCC.

ОБНОВЛЕНИЕ: Об обновленном вопросе, не связанном с #include, но подробнее о передаче объектов вокруг ...

В MyClass уже есть встроенный экземпляр OtherClass, test.Итак, в MyMethod это, вероятно, больше похоже на:

void MyClass::MyMethod()
{
    test.OtherMethod();
}

И если OtherMethod требуется доступ к экземпляру MyClass, передайте этот экземпляр в OtherMethod в качестве ссылки или указателя:

Byссылка

class OtherClass { public: void OtherMethod(MyClass &parent); }

void MyClass::MyMethod() { test.OtherMethod(*this); }

void OtherClass::OtherMethod(MyClass &parent)
{
   parent.AnotherMethod();
}

По указателю

class OtherClass { public: void OtherMethod(MyClass *parent); }

void MyClass::MyMethod() { test.OtherMethod(this); }

void OtherClass::OtherMethod(MyClass *parent)
{
   if (parent == NULL) return;  // or any other kind of assert
   parent->AnotherMethod();
}
2 голосов
/ 31 июля 2010

Создать файл .cpp:

#include "main.h"

void OtherClass::Othermethod()
{
    MyClass m; //ok :)
    m.MyMethod(); //also ok.
}

Реализации в любом случае не принадлежат заголовкам.

2 голосов
/ 31 июля 2010

Определите функцию вне любого класса в исходном файле C ++, а не в заголовке:

void OtherClass :: Othermethod() {
   // call whatever you like here
}
0 голосов
/ 31 июля 2010

Просто # включите его в other.cpp

...