我正在为我的班级做练习。我偶然发现了以下一行代码:
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;
}
我会感激任何帮助 - 即使是一个小小的暗示。
答案 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
)来传递 - 值。
希望这有帮助。