//成员函数定义
Screen& Screen::move(index r,index c)
{
index row = r * width;
cursor = row + c;
return *this;
}
const Screen& Screen::display(std::ostream& os) const
{
os << contents << '\n';
return *this;
}
//main中处理
myScreen.display(cout).move(4,0).set('#').display(cout);
解决办法:通过返回调用函数的对象的引用,可以将一些操作链接起来简化代码书写。
这里要注意,display函数返回的是const引用,因此在调用move函数中返回非const引用时无法实现转换导致出错。
解决的办法就是通过成员函数是否为const实现函数重载,定义两套函数,分别作为const成员函数和非const成员函数。
代码片段如下:
//通过是否为const成员函数实现重载
Screen& display(std::ostream &os)
{do_display(os);return *this;}
const Screen& display(std::ostream &os) const
{do_display(os);return *this;}
//提取公共函数
void do_display(std::ostream &os) const
{os<<contents;}
//main中处理
int main()
{
Screen myScreen(5,3);
const Screen blank(5,3);
//调用非const版本display
myScreen.display(cout).set('#').display(cout);
cout << endl;
//调用 const版本display
blank.display(cout);
return 0;
}
这样非常量myScreen调用非const版本的display函数,而const的blank对象调用const版本的display函数,从而避免了混淆。