gpt4 book ai didi

C++ 包含和循环依赖

转载 作者:搜寻专家 更新时间:2023-10-31 00:04:53 28 4
gpt4 key购买 nike

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

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

最佳答案

有些人每节课做一个 .h/.cpp:

我的.h

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

OtherClass test;
}
#endif // MY_H

其他.h

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

我的.cpp

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

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

关于C++ 包含和循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379004/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com