如何最好地将私有继承公开给 base class?
How best to expose private inheritance to base class?
我正在设计一个对象层次结构,其中所有对象的基础 class 是 Node
,预计将被子classed。 Node
的 Subclasses 将包含子项,但子项的类型可能因一个 subclass 而异。
我通过从 Owner<>
class 私有继承来实现子项目的所有权,这只是 std::vector
的包装器。我想将此所有权公开给基础 class(但没有其他人),因为在添加和删除子项方面有很多重复。所以我想出了这个:
#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;
}
这种方法感觉有点混乱,因为我在基 class 中存储了对派生 class 的引用(我以前从未见过这种情况)。这是好习惯吗?是否有更好的方法在派生 class 中保持子所有权,同时在基础 class 中处理通用子维护?
你快到了。不要在 Node
中存储对 DERIVED_T
的引用。随便写:
auto derivedThis& = *static_cast<DERIVED_T*>(this);
在每个需要它的函数中。 (或 const DERIVED_T*
视情况而定)。
我正在设计一个对象层次结构,其中所有对象的基础 class 是 Node
,预计将被子classed。 Node
的 Subclasses 将包含子项,但子项的类型可能因一个 subclass 而异。
我通过从 Owner<>
class 私有继承来实现子项目的所有权,这只是 std::vector
的包装器。我想将此所有权公开给基础 class(但没有其他人),因为在添加和删除子项方面有很多重复。所以我想出了这个:
#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;
}
这种方法感觉有点混乱,因为我在基 class 中存储了对派生 class 的引用(我以前从未见过这种情况)。这是好习惯吗?是否有更好的方法在派生 class 中保持子所有权,同时在基础 class 中处理通用子维护?
你快到了。不要在 Node
中存储对 DERIVED_T
的引用。随便写:
auto derivedThis& = *static_cast<DERIVED_T*>(this);
在每个需要它的函数中。 (或 const DERIVED_T*
视情况而定)。