C++类成员隐藏规则: Design question

标签 c++ interface

我有一个基类,Message ,这决定了政策。我还为特定的消息实例获得了该类的派生。

考虑这个简化的例子:

template< ::size_t MessageSize >
struct Message {
    enum { size = MessageSize };
    Bits< ChunkSize > bits_[size / ChunkSize];
    // Defines behavior for the Message types
};

template< ::size_t MessageSize >
struct SmallMessage : public Message< MessageSize > {
    Bits< MessageSize > bits_;
};

// other derivations of Message...

template< class MessageType, ::size_t MessageSize >
struct MakeMessage {
    typedef typename IfElseType<
            MessageSize < ChunkSize,
            SmallMessage< MessageSize >,
            Message< MessageSize >
        >::type type;
};

如果ChunkSize是 32,我生成以下内容:

MakeMessage< FooMessage, 16 >

Message< 16 >将导致 Bits< 32 > bits_[0];SmallMessage< 16 >将包含 Bits< 16 > bits_据我了解,这将影响原始的零大小成员。

我知道有几种方法可以处理这个问题:

  1. 声明一个不是bits_的名字并为此提供一个重写的接口(interface)
  2. 修改SmallMessage隐藏Message的所有方法处理 bits_与本地实现
  3. 制作Message中的方法虚拟

我的问题是这两种方法是否都有好处,或者是否有更好的方法来为各种大小的内存容器提供接口(interface),如上所述。

最终,我想要一些类似的东西:

typedef MakeMessage< FooMessage, 16 >::type message_type;
// ...
message_type message;
message.doSomethingToBits ();

不管实际使用的是什么容器,工作都是一样的。

最佳答案

好吧,尽我所能通过大量的 templatetypename,你正在尝试使用继承来组合,这被认为是错误的方式做吧。 SmallMessage 这里不是一种Message,因为正如您所注意到的,它不支持处理bits_以同样的方式排列。

我认为正确的方法是将 Message 作为抽象基类(重要:no bits_ 任何类型的,可能有很多纯虚函数),然后是 SmallMessageBigMessage 作为实现。此外,由于您无论如何都在使用模板,因此类型是在编译时确定的,实际上可能根本没有理由使用 Message。只要 SmallMessageBigMessage 具有相同的签名,即使它们没有共同的基类,您也可以按照您的描述使用 message_type .您需要基类 Message 的唯一原因是,如果您想更广泛地讨论消息,请使用后期绑定(bind)。虽然拥有基类也会静态地强制签名在声明中匹配,而不是给出奇怪的错误......有时......在代码的遥远部分因为你在其中一个类中错误声明了一个方法(但不是其他)。

可以肯定的是,您还希望 BigMessage::bits_[(size-1)/ChunkSize + 1],这只是上限而不是地上。这样您实际上就有足够的 Bitses 来容纳您所有的位。

关于C++类成员隐藏规则: Design question,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944270/

相关文章:

c++ - 模板运算符 << 循环

c++ - 在 C++ 中创建泛型函数

java - 枚举与枚举的区别

java - 接口(interface)如何隐藏实现细节

html - 如何删除 HTML/CSS 中的曲线

c++ - 我如何打印 UTF-8 字符 C++?

c++ - 将常量引用传递给对象 C++

c++ - Visual Studio,在某个过滤器(解决方案资源管理器)内的所有文件中查找/替换文本

Java 互操作 : Apply @JvmName to getters of properties in interface or abstract class

c# - 删除接口(interface)中的冗余类型