OOP类的概念

Concepts about OOP class

本文关键字:OOP      更新时间:2023-10-16

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

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

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

现在,当我有一个同时使用String和Integer函数的函数时,问题就来了。

让我们把这个新函数放到一个名为MultipleOperations的类中。MultipleOperations需要String和Integer类,这样它就可以同时继承这两个类,但String和Integer类已经继承了Parser,所以当试图从Parser类访问一些数据时是不明确的。

另一方面,如果set String和Integer类包含MultipleOperations,那么我就无法访问Parser类。

此外,我不太理解"hasa"的概念,因为在大多数情况下,我需要引用基类中的数据,因此它成为"is a"。

下面是我的问题的一个例子:

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类。

您的问题称为钻石问题。

对此有几种解决方案,更不用说其中一种,你可能会觉得很有趣。我建议你用谷歌搜索一下。

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

至于你们的课,我看不出有什么是非关系。您应该使用has-a(引用而不是内嵌)

相关文章:
  • 没有找到相关文章