无法使用“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 *”类型的成员子对象