关于班级构成

时间:2012-09-16 22:59:51

标签: c++ oop

我正在制作一个用于控制网络数据包的小系统。我有以下课程:

  • 数据包(具有检索和设置数据的功能)
  • AuthPackets(继承数据包类)
  • AuthSend(发送AuthPackets功能)
  • AuthRecv(AuthPackets的recv函数)

所以根据我的理解,AuthSend和AuthRecv是AuthPackets的组合,但它们都需要Packets类来实现功能。

所以代码看起来像这样:

class Stream {
private:
    int position;
    void* packet;
    void* get_streampointer();
    public:
        void Skip(int bytes);
        void NewPos(int pos);

        void SetShort(short Data);
        void SetInt(int Data);
        void SetStringRef(StringRef* stringref);

        short GetShort();
        int   GetInt();
        void GetStringRef(StringRef* storedata);
};

class Packets : public Stream {
public:
    void PacketEncrypt();
    void PacketDecrypt();
    short Size;
    short Type;
};

class AuthPackets: public Packets {
    AuthSend send;
    AuthRecv recv;
    bool Protocol(Player* player);
};

class AuthSend: public Packets {
public:
    void SecureToken(short SecurCode);
    void EncSecureToken(short SecurCode);
};

class AuthRecv: public Packets {
public:
    bool SecurCode(Player* player);
};

问题是,如果AuthSend和AuthRecv是AuthPackets类的一部分,它们必须继承Packet? (已经继承了Packets)。

此外,如果我从AuthSend和AuthRecv继承AuthPackets,我将失去调用这样的函数的糖语法:

authpackets.send.SecureToken

所以主要的问题是为什么我的设计存在缺陷? THX

2 个答案:

答案 0 :(得分:0)

AuthSend和AuthRecv应该从一个名为Packet的可能抽象的基类继承(注意:单数)。为什么您的AuthPackets类包含每种类型的成员,而不仅仅是常用功能?如果你需要一个类来保存auth数据包本身,它不应该继承Packet。

完整答案需要有关您要执行的操作的更多信息。

答案 1 :(得分:0)

好吧,我会尽力解决(我相信的)你的问题;如果您使用的是公共内容中的任何内容,它们确实需要从Packets继承:在AuthSend和AuthRecv中的数据包中。它们不是AuthPackets的一部分,它们只是AuthPackets中的对象。无论如何,通过在另一个具有public:of Packets的类中声明一个对象,您不会影响您的AuthSend和AuthRecv定义。如果你想在Packets中使用一些公开的东西,我觉得这里的一切似乎都很好,我不明白你是怎么说“设计中的一个缺陷”。如果我错过了,请在此处提供有关您的问题的更多信息。