更新: 让我澄清一下我的文件并重申我的问题:
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的方法。我确信这样的事情是可能的,但它可能只是我的设计很糟糕。任何方向都将不胜感激。
答案 0 :(得分:3)
有些人每班一个.h / .cpp:
#ifndef MY_H
#define MY_H
#include "other.h"
class MyClass
{
public:
void MyMethod();
OtherClass test;
}
#endif // MY_H
#ifndef OTHER_H
#define OTHER_H
class OtherClass
{
public:
void Othermethod();
}
#endif // OTHER_H
#include "my.h"
void MyClass::MyMethod() { }
#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
中