那个演员如何运作?

时间:2018-02-14 14:25:30

标签: c++

我正在为我的班级做练习。我偶然发现了以下一行代码:

std::cout << (const MaszynaStanow&)m << std::endl;

其中m是类的对象。

它无法编译。我认为它是某种对象的常量引用,对吗?

我还为“&lt;&lt;”写了一个运算符函数重载,以便我可以打印出对象所持有的值,如下所示:

std::cout << m;

我在编译时遇到以下错误:

.main.cpp:41:13: error: invalid operands to binary expression('ostream'(aka 'basic_ostream<char>') and 'const MaszynaStanow')
std::cout << (const MaszynaStanow&)m << std::endl;
~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~

这让我觉得我的运算符重载功能在这种情况下不合适(?)

ostream & operator<<(ostream & stream, MaszynaStanow & obj){
    cout<<"MaszynaStanow:"<<endl;
    for (int i = 0; i < obj.size; ++i){
        stream <<i<<" "<<obj.Next[i]->returnName();
        if (i == obj.chosenMode) cout <<" <";
        cout<<endl;
    }
    return stream;
}

我会感激任何帮助 - 即使是一个小小的暗示。

2 个答案:

答案 0 :(得分:4)

您明确地转换为const,但您的运算符只能使用MaszynaStanow的非常量实例。您的运营商应具有以下形式:

ostream & operator<<(ostream & stream, const MaszynaStanow & obj)
                                       ^^^^^
                                       you missed this

如果需要对象可修改,请保留当前版本,不要将对象强制转换为const对象。虽然我不希望operator<<修改它的右边操作数,所以const应该在那里。

答案 1 :(得分:1)

程序员似乎试图通过对对象执行先前的转换来模拟const-by-const-reference。但是,进行任何修改的真正地点在于:

ostream & operator<<(ostream & stream, MaszynaStanow & obj){
    cout<<"MaszynaStanow:"<<endl;
    for (int i = 0; i < obj.size; ++i){
        stream <<i<<" "<<obj.Next[i]->returnName();
        if (i == obj.chosenMode) cout <<" <";
        cout<<endl;
    }
    return stream;
}

当您要将 obj 转储到流时,可能不需要对 obj 进行任何修改,非恒定参考。以这种方式修复代码:

ostream & operator<<(ostream & stream, const MaszynaStanow & obj){
    cout<<"MaszynaStanow:"<<endl;
    for (int i = 0; i < obj.size; ++i){
        stream <<i<<" "<<obj.Next[i]->returnName();
        if (i == obj.chosenMode) cout <<" <";
        cout<<endl;
    }
    return stream;
}

现在你通过引用传递 obj ,但是这个引用是特殊的:虽然它非常有效,但它是等效的(因为使用了const)来传递 - 值。

希望这有帮助。