还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

error C2662: “Screen::move”: 不能将“this”指针从“const Screen”转换为“ Screen &” 转换丢失限定符

来源:清泛原创     2016-10-24 17:21:32    人气:     我有话说( 0 人参与)

出错代码: 成员函数定义Screen& Screen::move(index r,index c){ index row = r * width; cursor = row + c;...

出错代码:
//成员函数定义
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函数,从而避免了混淆。

error C2662 丢失限定符

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: