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クラスの両方にアクセスする必要があります。