gpt4 book ai didi

c++ - 无法访问类中声明的私有(private)成员

转载 作者:太空狗 更新时间:2023-10-29 20:58:52 25 4
gpt4 key购买 nike

我是第一次使用运算符重载,正在为提取运算符 (<<) 设置重载。我陷入了阻止我继续的两个错误之一。代码如下:

ostream &operator << (ostream &output, const Distance &d1)
{
if (d1.miles > 0)
{
output << d1.miles << "m ";
}
if (d1.yards > 0)
{
output << d1.yards << "y ";
}
if (d1.feet > 0)
{
output << d1.feet << "\' ";
}

output << d1.inches << "\"";

return (output);
}

重载在头文件中声明为友元如下:

friend ostream &operator<< (ostream output, const Distance &d1);

我遇到的第一个问题是,当重载以这种方式格式化(据我所知,这是正确的方式)时,它不允许我访问英里、码、英尺或英寸成员数据,尽管该函数在头文件中被设置为友元。

如果我将重载更改为读取:

ostream &operator << (ostream output, const Distance &d1)
{
if (d1.miles > 0)
{
output << d1.miles << "m ";
}
if (d1.yards > 0)
{
output << d1.yards << "y ";
}
if (d1.feet > 0)
{
output << d1.feet << "\' ";
}

output << d1.inches << "\"";

return (output);
}

然后重载工作正常,但它在我的主函数中不起作用,因为它返回错误:

error C2248: 'std::basic_ostream<_Elem,_Traits>::basic_ostream' : cannot access private member declared in class 'std::basic_ostream<_Elem,_Traits>'

对于函数中的每个 cout 实例。另外,我之前的例子表明这是不正确的。在阻止我访问私有(private)成员数据的第一个代码示例中,我做错了什么?我已经查看了在不同网站上被问到的其他几个例子,但没有什么能与我得到的完全匹配。我尝试使用 Visual Studio Express 2012 和 g++ 进行编译,但都返回了错误。

最佳答案

类定义中的声明应该是:

friend ostream &operator<< (ostream &output, const Distance &d1);
// ^--- important

你第一次尝试的错误是因为当你写一个函数时 ostream &operator<< (ostream &output, const Distance &d1) ,这与您加好友的函数不同,因为它具有不同的参数。

第二次尝试应该有各种错误,因为不允许按值传递 ostream。

关于c++ - 无法访问类中声明的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248640/

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