gpt4 book ai didi

c++ - 这是 "recognised"OO 模式吗?需要健全性检查!

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:18 26 4
gpt4 key购买 nike

如果我想扩展一系列我无法更改的对象的功能 - 例如添加格式,并且不想派生大量的类来扩展功能 - 以下内容会被认为是不好的吗? (我以 int 和 float 为例,但在我的程序中,我有大约 20 或 30 个类最终会出现在包含泛型类型的树中)。

class ITreeNode
{
public:
virtual ~ITreeNode() {}
virtual void print() = 0;
};

template <class T>
class ObjectNode : public virtual ITreeNode
{
public:
virtual ~ObjectNode() {}
ObjectNode(T v)
{
m_var = v;
}
void print()
{
print(m_var);
}
protected:
void print(int i)
{
printf("int (%d)\r\n", m_var);
}
void print(float f)
{
printf("float (%f)\r\n", m_var);
}
T m_var;
};

int _tmain(int argc, _TCHAR* argv[])
{
ObjectNode<int> tInt(5);
ObjectNode<float> tFloat(5.5);
tInt.print();
tFloat.print();
getchar();
return 0;
}

基本上我需要一个对象树(所有的基本类型都相同),我可以用这些扩展函数调用它。最初我使用访问者模式并为我需要的每个扩展功能创建一个访问者类。这看起来很麻烦,我想也许上面的会更好。

我想我会先在这里发帖作为完整性检查..

提前致谢。

最佳答案

您是否考虑过为您希望打印的每种类型专门化您的模板?这应该可以在不改变您调用代码的方式的情况下工作 - 但它还会提供一些编译时类型检查以确保您的通用类型具有有效的 print() 方法。

template<>
class ObjectNode<int> : public virtual ITreeNode {
ObjectNode(int v) : m_var(v) {}
void print() {
printf("int (%d)\r\n", m_var);
}
protected:
int m_var;
};

template<>
class ObjectNode<float> : public virtual ITreeNode {
ObjectNode(float v) : m_var(v) {}
void print() {
printf("float (%f)\r\n", m_var);
}
protected:
float m_var;
};

关于c++ - 这是 "recognised"OO 模式吗?需要健全性检查!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326433/

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