gpt4 book ai didi

c++ - 试图重载运算符==时如何比较两个类的私有(private)变量?

转载 作者:太空狗 更新时间:2023-10-29 22:56:45 28 4
gpt4 key购买 nike

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

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 类时,它说它无法访问私有(private)变量 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逻辑上相等(它们表示相同的字符串)但比较不相等的 s。

事实上,您可能想问一个单独的问题:您能实现 operator== 吗?仅使用 MyString 的公共(public)接口(interface)type? 在好的字符串类型中,答案应该是"is",因为您应该能够按顺序访问字符并查看长度。从效率的角度来看,这不太理想,但可以很好地检验接口(interface)是否良好。因此,您可能想尝试在不使用私有(private)字段的情况下实现此功能,只是为了确保您可以,然后考虑制作 operator == 的好处。一个friend以及从性能角度来看这是否是个好主意。

关于c++ - 试图重载运算符==时如何比较两个类的私有(private)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922374/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com