gpt4 book ai didi

c++ - 流式运算符和多态基类列表

转载 作者:行者123 更新时间:2023-11-30 05:18:33 25 4
gpt4 key购买 nike

我有一个类 vector ,我想将它们各自的参数显示到屏幕上。每个类都继承自 CBase vector 只是一个类型为 CBase 的指针列表.

我想避免将显示代码耦合到类中。因此,我将流运算符放在类定义之外。

所以我的类定义为

class CBase 
{
public:
virtual ~CBase(){}
};

class CChildA : public CBase
{
};

class CChildB : public CBase
{
};

vector 是这样设置的:

 void main()
{

CChildA A;
CChildB B;

std::vector<CBase*> myList;
myList.push_back(&A);
myList.push_back(&B);

display(myList);
}

个别显示运算符(operator)可能是:

std::ostream & operator<<(std::ostream & os, const CChildA & item)
{
os << "Child A Values Here";
return os;
}

std::ostream & operator<<(std::ostream & os, const CChildB & item)
{
os << "Child B Values Here";
return os;
}

实现display功能我们有问题因为<<不会选择正确的类,并且并非所有类都有流运算符定义(例如,类 CChildC 未在此处显示)。因此,第一次尝试显示可能是:

void display(std::vector<CBase*> &aList)
{
for(std::vector<CBase*>::iterator it = aList.begin(); it != aList.end(); it++)
{
if(CChildA * ca = dynamic_cast<CChildA*>(*it))
std::cout << *ca << "\n";
else if(CChildB * cb = dynamic_cast<CChildB*>(*it))
std::cout << *cb << "\n";
}
}

但有人告诉我使用 dynamic_cast皱眉。有没有一种简单的方法可以在没有 dynamic_cast 的情况下实现这一目标?

最佳答案

此时我不得不问你,

您的所有派生类都应该实现流操作吗?

如果答案是"is"或“当然!”,那么您为什么不将其作为界面的一部分?

是的,您会发现现在支持将对象打印到流中。但是,你自己也说了,它是所有派生类都必须有的属性。

我们再想一个问题——

如果我应该添加一个新的派生类,代码中的其他地方是否应该改变?

嗯...当然,但这些应该是小的变化。您不想更改使用流媒体运营商的每个地方。这将违反 OCP - Open Close Principle .


关于这个 -

I would like to avoid coupling the display code to the class. Therefore, I put the stream operators outside the class definition.

你要么:

  1. 错误地认为 Display 应该与 Base 分离
  2. 得到一个 ISP - Interface Segregation Principle违规。

如果每个派生类都应该是可显示的并且保存数据的容器应该显示每个元素 - 只需将相关方法添加到基类即可。

如果你的大部分代码与显示代码无关,而这些类确实与显示机制无关——每个派生类应该大概继承两个接口(interface)(纯抽象类)

  1. Base
  2. IDisplayable (随意命名)

并且您显示的显示方法应该收到 vector<IDisplayable*>而不是 vector<Base*> .

注意

如果你被迫接受 vector<Base*> , 你应该迭代元素并将它们转换为 IDisplayable* ( static_castdynamic_cast ,这真的取决于你的情况)

这与您当前的解决方案不同,因为您只需要一次转换(而不是为每个派生类都进行一次转换)

注2

我不太喜欢重载“<<”和“>>”运算符。我会考虑在界面中使用名为“显示”的纯虚函数,而不是虚拟运算符。

关于c++ - 流式运算符和多态基类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654543/

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