gpt4 book ai didi

c++ - 不完整类型结构的使用无效,即使有前向声明

转载 作者:可可西里 更新时间:2023-11-01 14:53:04 29 4
gpt4 key购买 nike

我知道循环依赖,但即使有前向声明我也能得到这个区域。我做错了什么?

// facility.h
class Area;

class Facility {
public:
Facility();
Area* getAreaThisIn();
void setAreaThisIsIn(Area* area);
private:
Area* __area;
};

// facility.cpp
#include "facility.h"
#include "area.h"
{ ... }

// area.h
class Facility;
class Area {
public:
Area(int ID);
int getId();

private:
std::list<Facility*> _facilities;
};

// area.cpp
#include "area.h"
#include "facility.h"

所以这编译得很好,但如果我这样做

// foo.h
#include "facility.h"
class Foo { .. };

// foo.cpp
#include "foo.h"
void Foo::function() {
Facility* f = new Facility();
int id = f->getAreaThisIsIn()->getId();

当我得到 invalid use of incomplete type struct Area

最佳答案

澄清一下:前向声明允许您以非常有限的方式对对象进行操作:

struct Foo; // forward declaration

int bar(Foo* f); // allowed, makes sense in a header file

Foo* baz(); // allowed

Foo* f = new Foo(); // not allowed, as the compiler doesn't
// know how big a Foo object is
// and therefore can't allocate that much
// memory and return a pointer to it

f->quux(); // also not allowed, as the compiler doesn't know
// what members Foo has

前向声明在某些情况下会有所帮助。例如,如果头文件中的函数只采用指向对象的指针而不是对象的指针,那么您不需要为该头文件#include 整个类定义。这可以改善您的编译时间。但是几乎可以保证该 header 的实现需要 #include 相关定义,因为您可能想要分配这些对象、调用这些对象的方法等,而且您需要的不仅仅是前向声明(forward declaration)。

关于c++ - 不完整类型结构的使用无效,即使有前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543331/

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