关于OOP类的概念

时间:2012-09-17 04:04:23

标签: c++ oop

我对OOP类的一些概念有疑问,假设我有以下类:

  • 包含用于解析流数据的数据的解析器类
  • 包含用于解析流数据的字符串操作的字符串类
  • 包含用于解析流数据的整数运算的整数类

因此,String和Integer类继承了Parser类,因为它们都需要有关流的特定信息,如位置,长度等。

现在问题来自于我有一个同时使用String和Integer函数的函数。

让我们将这个新函数放在一个名为MultipleOperations的类中。 MultipleOperations需要String和Integer类,因此它继承了这两个类,但String和Integer类已经继承了Parser,所以当尝试从Parser类访问某些数据时是不明确的。

另一方面,如果set String和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需要访问Parser类,并且需要访问String和Integer类。

2 个答案:

答案 0 :(得分:0)

这是一个已知的钻石层次问题,只存在于C ++中。尽管实现多个接口很好,但应该避免对类进行多重继承。这就是为什么更多现代语言如c#和java不允许多重继承。

至于你的课程,我没有看到任何关系。你应该使用has-a(引用而不是inherting)

答案 1 :(得分:0)

您的问题称为the diamond problem

对此有几种解决方案,其中一种,您可能会发现it很有趣。我建议你稍微谷歌吧。