当试图重载运算符==时,如何比较两个类的私有变量
How to compare private variables of two classes when trying to overload operator==?
我正在尝试重新创建字符串类,但在比较这两个类时遇到了困难,就好像它们是字符串一样。这就是我在头文件中的内容:
class Mystring {
public:
// ...
private:
// this variable stores the memory address of the text
char* ptr_buffer
// ...
};
在源文件中,我有thsi代码:
bool operator== (const Mystring& a, const Mystring& b) {
return a.ptr_buffer == b.ptr_buffer;
}
但出于某种原因,当我试图比较main.cpp中的两个Mystring类时,它说它无法访问私有变量ptr_buffer
。我以为它可以访问那个?如果我唯一关心比较的东西是隐藏的,我该如何比较这两者?
从C++语言的角度来看,在全局范围内引入的重载运算符与全局范围内的任何其他函数一样(除了它自定义一个内置运算符的工作方式之外)。正如普通的旧自由函数不能访问类的private
字段一样,自由函数重载运算符也不能访问它为其重载运算符的类的private
字段。
这样做有充分的理由。例如,自定义类重载operator <<
非常常见,其中一个参数是ostream
引用,另一个是自定义类型。如果这个自定义重载可以访问ostream
类型的字段,那就太糟糕了!
您在类的实现文件中定义了operator ==
这一事实也无关紧要。C++没有类的"实现文件"的概念,尽管类通常是这样实现的。在这方面,它将所有源文件视为平等的。
要解决此问题,可以将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
(它们表示同一字符串),但比较起来不相等。
事实上,您可能想问一个单独的问题:是否可以仅使用MyString
类型的公共接口来实现operator==
在一个好的字符串类型中,答案应该是"是",因为你应该能够按顺序访问字符并查看长度。从效率的角度来看,这并不理想,但这是一个很好的测试,可以看看接口是否良好。因此,您可能希望尝试在不使用私有字段的情况下实现此函数,以确保可以,然后考虑将operator ==
设置为friend
的好处,以及从性能角度来看这是否是一个好主意。
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 命令行参数,cant 或两个变量
- 在 for 循环中更新两个变量时遇到问题C++
- C++ 编译时在两个变量之间交替
- C++ 如何在包含两个变量的结构中存储与变量不同数量的值?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 是否可以在C++中使用宏交换两个变量的出现?
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 可视C 编译器将相同的存储位置提供给两个变量
- 尝试使用 {} 和 std::make_pair() 交换两个变量时的行为不同
- 在rootframework中的根文件中编写两个变量
- 最短路径,带有两个变量
- 加入两个变量和LCD打印
- 在循环中声明两个变量以逆转字符串?在C 中
- 具有两个变量的"for"循环,一个变量每次迭代递增,每隔一次迭代递增
- 如何在C++中使用一个类中两个变量的值
- 仅在C 中的一个变量上,两个变量函数的数值集成(使用数值配方库)
- 如何在我存储的两个变量之间生成随机数