概念

2012-09-17 228 views
0

我有OOP類的一些概念的問題,可以說,我有以下類:概念

  • 分析器類,其包括數據用於解析一個流數據
  • String類,其包括串爲解析流數據業務
  • Integer類,其中包括用於分析數據流

所以字符串和Integer類繼承Parser類,因爲它們都需要整數運算有關流的具體信息,如位置,長度等。

現在的問題出現在我有一個同時使用String和Integer函數的函數。

讓我們把這個新函數放在一個名爲MultipleOperations的類中。 MultipleOperations需要String和Integer類,因此它繼承了String和Integer類,它們已經繼承了Parser,所以當試圖從Parser類訪問某些數據時是不明確的。

另一方面,如果設置字符串和Integer類具有MultipleOperations組成,那麼我不會有權訪問Parser類。

另外我不明白「有一個」的概念,因爲在大多數情況下,我需要引用基類的數據,所以這使得它是一個「是」。

這裏是我的問題的一個例子:

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需要訪問分析器類和需要訪問字符串和整類。

回答

0

你的問題叫做the diamond problem

有幾個解決方案,提一個,你可能會發現it有趣。我建議你有一點谷歌。

+0

謝謝,我會看看它 – ffenix

0

這是鑽石層次結構的一個已知問題,只存在於C++中。儘管實現多個接口是可以的,但您應該避免對類進行多重繼承。這就是爲什麼更多現代語言如c#和java不允許多重繼承的原因。

至於你的課程,我沒有看到任何關係。你應該使用has-a(引用而不是inherting)

+0

你能提供一個例子嗎?這聽起來在邏輯上正確的使用「解析器有一個字符串」,但String類需要訪問Parser,與Integer類相同,組合不允許我這樣做。 – ffenix