无法使用“Shape *”类型的左值初始化“Shape Shape::*”类型的返回对象

Posted

技术标签:

【中文标题】无法使用“Shape *”类型的左值初始化“Shape Shape::*”类型的返回对象【英文标题】:cannot initialize return object of type 'Shape Shape::*' with an lvalue of type 'Shape *' 【发布时间】:2017-02-13 01:44:34 【问题描述】:

问题是静态函数期望返回类型为Shape Shape::* 吗?并且得到一个只是Shape*

static Shape Shape::*makeShape(char ch,int posx,int posy)

    Shape *rp = new O(posx, posy);
    return rp;


O::O(int posx, int posy)
    x = &posx;
    y = &posy;

【问题讨论】:

注意你把星号放在哪里,你应该返回一个指向Shape的指针(即Shape*)。 一旦获得要构建的代码,您就会遇到更糟糕的问题,因为您在 O 构造函数中存储指向局部变量的指针。一旦构造函数返回,参数将超出范围并消失,留下指向不存在数据的指针。 为什么你使用指针?从工厂函数makeShape返回的O构造函数(对我来说似乎也是一个坏名字)? 你对编译错误的分析是对的,绝对正确。这里的预期返回值是指向名为Shape 的类成员的指针,该成员的类型也是Shape。这是一个逻辑谬误,因为一个类不能包含它自己。如果有可能,整个宇宙将被吞入一个超大质量黑洞,导致每个粒子以光速发生亚原子爆炸。 【参考方案1】:
// return type (marked with v)
//     vvvvv        v
static Shape Shape::*makeShape
//           ^^^^^^^ ^^^^^^^^^
// function name (marked with ^)

您似乎混淆了返回类型和函数名称。

你的意思大概是

static Shape *Shape::makeShape(...)

【讨论】:

以上是关于无法使用“Shape *”类型的左值初始化“Shape Shape::*”类型的返回对象的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法使用“const char [34]”类型的左值初始化“const char”类型的返回对象

无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象

错误:无法使用“int [r][c]”类型的左值初始化“int *”类型的返回对象

函数类型的左值是不是是可修改的左值?

绑定 T&& 类型的左值表达式

C++11 中的左值引用和右值引用的区别