gpt4 book ai didi

c++ - 如何最好地将私有(private)继承公开给基类?

转载 作者:行者123 更新时间:2023-11-28 00:07:20 25 4
gpt4 key购买 nike

我正在设计一个对象层次结构,其中所有对象的基类都是 Node ,预计将被子类化。 Node 的子类将包含子项,但子类的类型可能因子类而异。

我通过从 Owner<> 私有(private)继承来实现子项的所有权类,它只是 std::vector 的包装器.我想将此所有权公开给基类(但没有其他人),因为在添加和删除子项方面有很多重复。所以我想出了这个:

#include <vector>
using namespace std;

//Class to contain child items
template <typename T>
struct Owner {
vector<T> children;
};

//Types of children that can be owned by nodes in the hierarchy
struct ChildType1{};
struct ChildType2{};
struct ChildType3{};

//Node base class
template <typename DERIVED_T>
struct Node {
Node(DERIVED_T& _derivedThis):
derivedThis(_derivedThis)
{}

template <typename ITEM_T>
void AddItem() {
/*Possibly do a lot of pre-checks here before adding a child*/
derivedThis.Owner<ITEM_T>::children.emplace_back();
}

//Reference to the most-derived subclass instance
DERIVED_T& derivedThis;
};

//A possible subclass of Node
struct DerivedNode:
private Owner<ChildType1>,
private Owner<ChildType2>,
public Node<DerivedNode>
{
friend struct Node<DerivedNode>;

DerivedNode():
Node(*this)
{}
};


int main() {
DerivedNode d;
d.AddItem<ChildType1>();
d.AddItem<ChildType2>();
//d.AddItem<ChildType3>(); //Fails to compile (intended behavior; DerivedNode should not own ChildType3 objects)

return 0;
}

这种方法感觉有点困惑,因为我在基类中存储了对派生类的引用(我以前从未见过这种情况)。这是好习惯吗?在基类中处理通用子维护的同时,是否有更好的方法在派生类中保留子所有权?

最佳答案

你快到了。不要在 Node 中存储对 DERIVED_T 的引用。只写:

     auto derivedThis& = *static_cast<DERIVED_T*>(this);

在每个需要它的函数中。 (或 const DERIVED_T* 视情况而定)。

关于c++ - 如何最好地将私有(private)继承公开给基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34794439/

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