提问者:小点点

在C++中处理循环依赖关系[重复]


所以,我知道有很多关于堆栈溢出的问题,试图处理循环依赖关系。但这些都不能真正回答我的问题,如果有可能让两个类互相认识,更重要的是,互相获取信息。所以,基本上,我读过你可以使用前向声明,但是使用前向声明,我不能访问任何字段。

假设我们有一个名为Scene的类和一个名为EntityBase的类,它们的定义如下:

EntityBase.h

#pragma once
#include <string>
#include "Scene.h"

class EntityBase
{
public:
    std::string entityId;
    Scene scene;


    EntityBase(std::string entityId);

    /* 
    This method will be called when this object is added to the scene 
    */
    void onAddedToScene(Scene* scene);

    /*
    This method will be called when this object is removed from the scene
    */
    void onRemovedFromScene(Scene* scene);
};

场景h

#pragma once
#include <vector>
#include <string>
#include "EntityBase.h"

class Scene
{
public:
    std::vector<EntityBase> entities;
    std::string name;

    Scene(std::string name);

    void addToScene(EntityBase& entityBase);
};

在EntityBase也可以完全访问场景的同时,如何打印出场景的名称(并使用场景的各种方法)?所以,如果你能告诉我怎么做,我会非常感激,因为以后我可能需要访问每个字段和/或方法。


共1个答案

匿名用户

因为是C++17标准,所以不需要类的完整类定义,只需要一个向前声明:

#pragma once
#include <vector>
#include <string>

class EntityBase;  // Forward declaration

class Scene
{
public:
    std::vector<EntityBase> entities;
    std::string name;

    Scene(std::string name);

    void addToScene(EntityBase& entityBase);
};

当然,您需要在使用向量的任何地方包括,最值得注意的是源文件。

由于使用的是的实际实例,因此不能使用该类和头文件。这里必须包含头文件。

如果您构建的目标是较早的C++标准(C++14或更早),那么您必须具有向量的类的完整定义。

作为一种可能的解决办法,要么使成为指向的指针向量;或者使成为指针,并在头文件中使用forward声明。或者两者的结合。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|循环|依赖|关系|重复)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?