首先,似乎我在征求主观意见,但这并不是我所追求的。我很想听听有关该主题的一些有充分根据的论点。
为了对如何设计现代流/序列化框架有所了解,我最近得到了Angelika Langer和Klaus Kreft撰写的《Standard C ++ IOStreams and Locales》一书的副本。我发现,如果IOStreams的设计不当,那么它就不会首先进入C ++标准库。
在阅读了本书的各个部分之后,我开始怀疑IOStreams是否可以从整体架构的角度与STL进行比较。阅读例如对Alexander Stepanov(STL的“发明人”)的采访,以了解有关STL的一些设计决策。
特别令我惊讶的是:
谁来负责IOStreams的总体设计似乎是个未知数(我很想阅读有关此的一些背景信息-有人知道好的资源吗?);
一旦你钻研输入输出流,例如眼前表面之下,如果你想输入输出流用自己的类扩展,你会得到一个接口具有相当神秘和扑朔迷离的成员函数的名称,例如getloc/ imbue,uflow/ underflow,snextc/ sbumpc/ sgetc/ sgetn,pbase/ pptr/ epptr(和有可能甚至更糟的例子)。这使得了解整体设计以及单个零件如何协作变得更加困难。即使我上面提到的那本书没有帮助那多(恕我直言)
因此,我的问题是:
如果你要判断今天的软件工程标准(如果确实是对这些任何普遍同意),将C ++的输入输出流仍然被认为是经过精心设计?(我不想通过通常认为过时的方法来提高软件设计技能。)
我需要编写一个将由新手和经验丰富的C++开发人员使用的编码约定.动态多态的继承规则如下:
- 对于动态多态,请考虑使用单继承(树状层次结构),可能具有抽象接口的多重继承
- 对于继承层次结构(基类等),默认情况下使用公共继承
- 对于继承抽象接口,默认情况下使用公共虚拟继承
此规则之后将提供有关实施,可能的例外等的详细信息.
所以,问题是这个规则是否适合新手和经验丰富的C++开发人员?(欢迎/利弊,以及来源和链接是受欢迎的)
我看到的是:
注意:我已阅读以下在线资源:
注2:在"C++编码标准"第36项中使用Sutter&Alexandrescu后,使用"抽象接口"名称
这是一个应该工作的情况(它的Java/C#等效使用接口工作),但如果接口继承不是虚拟的,那么在C++中就不会这样:
class A
{
public :
virtual ~A() = 0 {}
} ;
class B : public A {} ; // should have been virtual to avoid the error
class C : public A {} ; // should have been virtual to avoid the error
class D : public B, public C
{
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用抽象类在C++中定义接口类型,并使用具体类来实现它们.我遇到的问题是我不能从另一个接口继承和接口,并从基础具体类继承实现.
我的目标是能够定义可以从不太复杂的基接口继承的接口层次结构.我还希望能够通过继承具体类来扩展接口的实现(比如在下面的例子中继承自TObjectA).
这就是我所拥有的.我得到的错误是"抽象类类型的对象"TObjectB"是不允许的".我相信我知道为什么,这是因为我没有在TObjectB中实现MethodA().但我真的想要的是由基类(TObjectA)提供的实现,并且仍然具有接口层次结构(IInterfaceB继承自IInterfaceA).我也不想在我派生的concreate类中重复所有继承的接口方法.我怎样才能做到这一点?
class IInterfaceA
{
public:
virtual void MethodA() = 0;
};
class IInterfaceB : IInterfaceA
{
public:
virtual void MethodB() = 0;
};
class TObjectA : public IInterfaceA
{
public:
void MethodA() { cout << "Method A"; }
};
class TObjectB : public TObjectA, public IInterfaceB
{
public:
void MethodB() { cout << "Method B"; }
};
void TestInterfaces()
{
IInterfaceB* b = new TObjectB(); // error: object of abstract class type "TObjectB" is not allowed
b->MethodB();
delete …Run Code Online (Sandbox Code Playgroud) 我正在制作游戏GUI API,其中每个小部件都继承自Widget类.我在想,当其他人制作自己的小部件时,他们可能对基类不满意.例如,他们可能想要添加getTheme().让我的所有小部件实际上都是从Widget继承,那么这是可能的吗?
谢谢
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB: virtual public IA
{
public:
virtual void b() = 0;
};
class B: virtual public IB, public A
{
public:
virtual void b()
{
}
};
Run Code Online (Sandbox Code Playgroud)
你是否总是像我一样继承你的界面虚拟?如果没有,您将如何强制执行上述代码?
说我有4节课:
class I { public: virtual void X() = 0; };
class A : public virtual I { public: virtual void X() { } };
class B : public I { };
class C : public A, public B { };
Run Code Online (Sandbox Code Playgroud)
I,B并且C是抽象的,而A不是.如果我只需添加virtual到继承I的B,那么A::X()解决I::X()在C.
但是,我无法改变其来源B.
我的问题:我能A::X()解决I::X的C,而不能改变B?我试过声明A并B虚拟C无济于事.我试图没有冗余代码(例如,有C声明X(){A …