概念

2012-09-17 76 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