- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类 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.
你要么:
如果每个派生类都应该是可显示的并且保存数据的容器应该显示每个元素 - 只需将相关方法添加到基类即可。
如果你的大部分代码与显示代码无关,而这些类确实与显示机制无关——每个派生类应该大概继承两个接口(interface)(纯抽象类)
Base
类IDisplayable
(随意命名)并且您显示的显示方法应该收到 vector<IDisplayable*>
而不是 vector<Base*>
.
注意
如果你被迫接受 vector<Base*>
, 你应该迭代元素并将它们转换为 IDisplayable*
( static_cast
或 dynamic_cast
,这真的取决于你的情况)
这与您当前的解决方案不同,因为您只需要一次转换(而不是为每个派生类都进行一次转换)
注2
我不太喜欢重载“<<”和“>>”运算符。我会考虑在界面中使用名为“显示”的纯虚函数,而不是虚拟运算符。
关于c++ - 流式运算符和多态基类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654543/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!