C ++包含和循环依赖

时间:2010-07-31 16:55:52

标签: c++ include circular-dependency

更新: 让我澄清一下我的文件并重申我的问题:

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,而对象B又调用来自对象A的方法。我确信这样的事情是可能的,但它可能只是我的设计很糟糕。任何方向都将不胜感激。

4 个答案:

答案 0 :(得分:3)

有些人每班一个.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。 编辑:正如评论所说,以及相关的Wikipedia page#pragma once也得到GCC的支持(至少)。

更新: 关于更新的问题,与#include无关,但更多关于传递对象...

MyClass已经有了一个OtherClass的嵌入式实例,test。所以,在MyMethod中,它可能更像是:

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

如果OtherMethod需要访问MyClass实例,请将此实例作为引用或指针传递给OtherMethod:

参考

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();
}

答案 1 :(得分:2)

在C ++源文件中的任一类之外定义函数,而不是在标题中定义:

void OtherClass :: Othermethod() {
   // call whatever you like here
}

答案 2 :(得分:2)

创建.cpp文件:

#include "main.h"

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

无论如何,实现都不属于标题。

答案 3 :(得分:0)

只需将#include包含在other.cpp