gpt4 book ai didi

c++ - 如何定义具有循环依赖性的 C++ 类?

转载 作者:太空狗 更新时间:2023-10-29 21:02:50 24 4
gpt4 key购买 nike

我正在尝试建立一个基本的实体/对象管理系统,我有两个类,一个作为继承实体的基类,另一个管理和控制它们。

这是我尝试使用的源代码:

#include <iostream>
#define MAX_ENTS 400
class EFentity;
class EFiterator;
class EFentity {
public:
EFentity();
virtual bool step();
virtual void create(EFiterator*,int);
virtual void destroy();
private:
int holder_id;
EFiterator* holder;
};
EFentity::EFentity(void) {
// add base entity stuff
}
void EFentity::destroy() {
holder->ents[holder_id]=NULL;
std::cout << "destroying object id "<<holder_id;
delete this;
}
void EFentity::create(EFiterator* h,int pos) {
holder=h;
holder_id=pos;
}
bool EFentity::step() {
return false;
}
class EFiterator {
public:
EFentity* ents[MAX_ENTS];
int e_size;
EFiterator();
void push(EFentity* e);
void update();
};
EFiterator::EFiterator() {
e_size=0;
}
void EFiterator::update() {
for(int i=0;i<e_size;i++) {
if (!ents[i]->step()) {
std::cout << "entity id "<< i<<" generated a fault!\n";
} else std::cout << "entity id "<<i<<" passed step test.\n";
}
}
void EFiterator::push(EFentity* e) {
ents[e_size]=e;
e->create(this,e_size++);
}
int main() {
EFiterator main_iterator;
main_iterator.push(new EFentity());
main_iterator.update();
std::cin.get();
return 0;
}

这段代码显然无法编译,错误如下:

In member function `virtual void EFentity::destroy()':

[20] invalid use of undefined type `struct EFiterator'
[5] forward declaration of `struct EFiterator'

我以前在SO上看到过类似的问题,但是他们不需要访问其他类的成员变量和函数,所以很容易用指针解决。

认为这可以通过在 EFiterator 中访问数组的原型(prototype)函数来解决,但是有没有一种方法可以通过一些棘手的类操作来顺利地做到这一点?

最佳答案

EFentity::destroy() 在调用时需要知道 EFiterator 的具体类型

 holder->ents[holder_id]=NULL;

EFentity::destroy()放在EFiterator定义之后应该可以解决问题,例如将它放在EFiterator之后

void EFiterator::push(EFentity* e) {
ents[e_size]=e;
e->create(this,e_size++);
}

void EFentity::destroy() {
holder->ents[holder_id]=NULL;
std::cout << "destroying object id "<<holder_id;
delete this;
}

通常在头文件中转发声明类型并在.cpp文件中包含具体类型,这打破了循环包含问题。

EFentity.h

class EFiterator;
class EFentity {
public:
EFentity();
virtual bool step();
virtual void create(EFiterator*,int);
virtual void destroy();
private:
int holder_id;
EFiterator* holder;
};

EFentity.cpp

#include "EFiterator.h"

EFentity::EFentity(void) {
// add base entity stuff
}
void EFentity::destroy() {
holder->ents[holder_id]=NULL;
std::cout << "destroying object id "<<holder_id;
delete this;
}
void EFentity::create(EFiterator* h,int pos) {
holder=h;
holder_id=pos;
}
bool EFentity::step() {
return false;
}

关于c++ - 如何定义具有循环依赖性的 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14698354/

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