繁体   English   中英

无法访问类中声明的私有成员

[英]Cannot access private member declared in class

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

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);
}

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

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

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

类定义中的声明应该是:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM