0

OOPクラスのいくつかの概念に問題があります。たとえば、次のクラスがあるとします。

  • ストリームデータを解析するためのデータを含むパーサークラス
  • ストリームデータを解析するための文字列操作を含む文字列クラス
  • ストリームデータを解析するための整数演算を含む整数クラス

したがって、StringクラスとIntegerクラスは、位置や長さなどのストリームに関する特定の情報を必要とするため、Parserクラスを継承します。

文字列関数と整数関数の両方を使用する関数がある場合に問題が発生します。

この新しい関数をMultipleOperationsというクラスに入れましょう。MultipleOperationsはStringクラスとIntegerクラスを必要とするため、両方を継承しますが、StringクラスとIntegerクラスはすでにParserを継承しているため、Parserクラスから一部のデータにアクセスしようとするとあいまいになります。

一方、set String and IntegerクラスがMultipleOperationsの構成を持っている場合、Parserクラスにアクセスできません。

また、ほとんどの場合、基本クラスのデータを参照する必要があるため、「has a」の概念をあまり理解していません。そのため、「isa」になります。

これが私の問題の例です:

class Parser{
private:
    int errorcode;
    char comment;
    const char* address;
    const char* maxaddress;
    unsigned int position;
public:
    Parser(const char* _address, const char* _maxaddress) : errorcode(NO_ERROR_PRESENT) {};
    const char* s_address(const char* _address) {address = _address;}
    const char* s_maxaddress(const char* _maxaddress) {maxaddress = _maxaddress;}
    const char* s_position(unsigned int _pos) {position = _pos;}
    char r_comment() const {return comment;}
    const char* r_address() const {return address + position;}
    const char* r_maxaddress() const {return maxaddress;}
    unsigned int r_position() const {return position;}

    int geterror();
    void set_error(int code) {errorcode = code;}

    void set_comment(const char char_comment);
    void set_position(unsigned int position);
    void resetboundary(unsigned int address, unsigned int maxaddress);
};

class Integer: public Parser {
public:
    //Get an int token
    int GetInt();
};

class String: public Parser {
private:
    int NullByToken(char*, int, char);                          //Null a string by token
    void CleanString(std::string string);                       //Clean an string to its simple form (removing spaces, tabs, etc)
    public:
        Displacement* GetEndOfLine();                           //Get len till end of line
        Displacement* GetSimpleString();
        bool SplitByChar(const char token, SplitString* setstrings);
};

class MultiOperation: public String, public Integer {
    void* GetDataByPrefix(unsigned int Type, char token, const char* prefixcmp);
};

関数GetDataByPrefixは、Parserクラスにアクセスする必要があり、StringクラスとIntegerクラスの両方にアクセスする必要があります。

4

2 に答える 2

0

これは、C++にのみ存在するダイヤモンド階層の既知の問題です。複数のインターフェースを実装することは問題ありませんが、クラスの多重継承は避ける必要があります。そのため、c#やjavaなどの最新の言語では多重継承が許可されていません。

あなたのクラスに関しては、私は何も見ていません-関係。has-aを使用する必要があります(継承する代わりに参照する)

于 2012-09-17T04:16:02.033 に答える
0

あなたの問題は菱形継承問題と呼ばれます。

これにはいくつかの解決策がありますが、1つ挙げると、興味深いと思うかもしれませ。少しググってみることをお勧めします。

于 2012-09-17T04:17:11.083 に答える