0

ネットワーク パケットを制御するための小さなシステムを作成しています。私は次のクラスを持っています:

  • パケット(データ取得・設定機能あり)
  • 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 クラスの一部である場合に Packets を継承しなければならないのか? (すでにパケットを継承しています)。

また、AuthSend と AuthRecv から AuthPackets を継承すると、次のような関数を呼び出すためのシュガー構文が失われます。

authpackets.send.SecureToken

では、主な質問は、なぜ私のデザインに欠陥があるのか​​ということです。どうも

4

2 に答える 2

0

さて、ここであなたの問題(私が信じていること)の解決策を提供しようとします。パブリックなものから何かを使用している場合は、パケットから継承する必要があります: AuthSend および AuthRecv のパケットで。それらは AuthPackets の一部ではなく、AuthPackets 内の単なるオブジェクトです。public: of Packets を持つ別のクラスでオブジェクトを宣言しても、AuthSend および AuthRecv の定義には影響しません。パケットで公開されているものを使用したい場合、ここですべてがうまくいくように見えるのに、「設計上の欠陥」をどのように意味するのかわかりません。私が行方不明の場合は、ここで問題に関する詳細情報を提供してください。

于 2012-09-16T23:39:42.580 に答える
0

AuthSend と AuthRecv は、可能であれば Packet と呼ばれる抽象基本クラスから継承する必要があります (注: 単数形)。AuthPackets クラスに共通の機能だけでなく、各タイプのメンバーが含まれているのはなぜですか? 認証パケット自体を保持するクラスが必要な場合は、Packet から継承しないでください。

完全な回答を得るには、何をしようとしているのかについての詳細情報が必要です。

于 2012-09-16T23:09:03.973 に答える