gpt4 book ai didi

C++,基类如何包含子类作为成员并调用其方法

转载 作者:行者123 更新时间:2023-11-28 01:47:31 24 4
gpt4 key购买 nike

我有一些使用 Java 和 C 的经验,但现在才开始使用 C++。我正在尝试编写一种逻辑树:

所有项目都派生自抽象基类“Item”。有些项目是容器,可以包含多个项目。它们派生自类“Block”。一个 block 可以包含其他 block (这是递归的)。它还具有运营商信息其他元素是可运行的,它们不包含其他项目。

到目前为止,我可以构建我的树(并使用 pugixml lib 顺便将它反射(reflect)到 xml 文件中或从中反射(reflect)出来)。但是现在在我的应用程序中,我想轻松地沿着树“移动自己”。问题是我需要保留一个指向存储项目的容器的指针,以便我可以返回。 (第一个 block 将有 'nullptr')

所以我有:(当然有#ifdef guardblocks 我没有在这里复制)

在 item.h 中:

#include "block.h" //issue here!

enum Item_t { ... };

class Item
{
public:
Item(Block* parentBlock, int order_number, int loop_number=1);
virtual ~Item();

virtual Item_t getItemSubClass() const = 0; //just for some kind of reflexivity hack for other function (here in this sample to show this is abstract)

protected:
Block* m_parentBlock;
int m_order_number;
int m_loop_number;
int m_current_loop=0;
private:
};

在 block.h 中:

#include "item.h"
#include <string.h>
#include <map>
#include <iostream>

enum Operator { undefined, serial, parallel };

//class Item; // <= forward declaration ? won't work !

typedef std::map<int, Item*>::const_iterator item_iterator_t;

class Block : public Item
{
public:
Block(Block* parentBlock, int order_number, std::string op_str, int loop_number=1);
virtual ~Block();

void addSubItem(int index, Item* item);
const Item* getSubItem(int index) const;

item_iterator_t item_begin() const;
item_iterator_t item_end() const;

Operator getOperator(void) const;
virtual Item_t getItemSubClass() const override;
protected:
private:
Operator m_op;
std::map<int, Item*> m_subItems;
};

问题在这里:

  • Item 需要包含 block.h,因为它有指向它的成员指针,并且它在 cpp 文件中的构造函数调用 block.addSubItem() 方法。

  • Block 显然需要包含 item.h,因为它派生自它。

  • 当需要调用方法或从类继承时,前向声明是不够的(因此对于这两种情况)。

  • 我可以通过不在构造函数中设置父/子关系来稍微更改设计(这可以正常工作,但我很想看到这个继承/递归问题的解决方案)

最佳答案

在我写问题的过程中,我找到了解决方案。我的问题是由于我的编码风格,我倾向于让我的 class.cpp 文件只包含我相应的 class.h 文件,并将所有其他 include 命令集中在 header 中。 (最后这可能不是一个好习惯)

  • 在 block.h 中:(没有其他选择继承)

    #include "item.h" 
  • 在 item.h 中:使用前向声明

    class SeqBlock;
  • 在 item.cpp 中:包括两者!

    #include "item.h" //optional as included in block.h but make it clear
    #include "block.h"

(不确定这是最好的解决方案还是原始设计有很大缺陷)

关于C++,基类如何包含子类作为成员并调用其方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44326686/

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