在尝试重载operator ==时如何比较两个类的私有变量?

时间:2017-10-25 01:12:44

标签: c++ operator-overloading

我正在尝试重新创建字符串类,并且在比较两个类相互比较时遇到了麻烦,就好像它们是字符串一样。这就是我在头文件中的内容:

class Mystring {
public:
   // ...
private:
    // this variable stores the memory address of the text
    char* ptr_buffer

    // ...
};

在源文件中,我有代码:

bool operator== (const Mystring& a, const Mystring& b) {
    return a.ptr_buffer == b.ptr_buffer;
}

但是出于某种原因,当我尝试比较main.cpp中的两个Mystring类时,它说它无法访问私有变量ptr_buffer。我以为它可以访问它?我如何比较这两个我唯一关心比较的东西?

1 个答案:

答案 0 :(得分:1)

从C ++语言的角度来看,在全局范围内引入的重载运算符就像全局范围内的任何其他函数一样(除了它自定义其中一个内置运算符的工作原理) 。正如常规的旧自由函数无法访问类的private字段一样,自由函数重载运算符无法访问其重载类的private字段。运营商。

有充分的理由这样做。例如,自定义类重载operator <<,其中一个参数是ostream引用而另一个是自定义类型,这是很常见的。如果此自定义重载可以访问ostream类型的字段,那将是非常糟糕的。

您在类的实现文件中定义operator ==这一事实也无关紧要。 C ++没有&#34;实现文件&#34;的概念。对于一个类,即使通常是如何实现类。在这方面,它将所有源文件视为相等。

要解决此问题,您可以将operator ==函数声明为该类的friend

class MyString {
public:
     ...
     friend bool operator== (const MyString& lhs, const MyString& rhs);
}

...

bool operator== (const MyString& lhs, const MyString& rhs) {
    // You were given explicit authorization to access private fields,
    // so go right ahead!
}

但是,您确定operator ==的实施是否正确?您正在比较存储在MyString对象中的指针,而不是它们指向的字符串的内容。如果你在某个地方的内存中有两个不同的同一个字符串文字副本,你可以有两个MyString在逻辑上相等(它们代表相同的字符串),但它们不相等。

事实上,您可能想问一个单独的问题:您是否可以仅使用operator==类型的公共接口实现MyString在良好的字符串类型中,答案应该是&#34;是的,&#34;因为您应该能够按顺序访问字符并查看长度。从效率的角度来看,这不是理想的,但它是一个很好的测试,看看界面是否良好。所以你可能想尝试实现这个函数而不用使用私有字段只是为了确保你可以,然后考虑让operator ==成为friend的好处以及是否&# 39;从绩效角度来看,这是一个好主意。