将前向声明的指针转换为更具体的类型
Posted
技术标签:
【中文标题】将前向声明的指针转换为更具体的类型【英文标题】:Cast forwardly-declared pointer to more specific type 【发布时间】:2015-01-28 03:26:21 【问题描述】:我有一门课
class Shape;
class Triangle;
class Amorpher
public:
Amorpher();
Amorpher(Shape*);
Amorpher(Shape&);
~Amorpher();
Shape* pShape;
void GetShapeArea();
void Shapeshift(Shape&, string);
void Shapeshift(Shape*, string);
private:
Triangle* triangle;
;
和实现
Amorpher::Amorpher()
Amorpher::Amorpher(Shape* shape) : pShape(shape)
void Amorpher::GetShapeArea()
cout << "shape area is: " << pShape->Area();
Amorpher::~Amorpher()
void Amorpher::Shapeshift(Shape* shape,string shiftTo)
if (shiftTo == "triangle")
(Triangle*)shape = triangle;
三角形继承自形状。我想在 Shapeshift 方法中尝试将传递给方法的 Shape 转换为三角形。不是所有的形状都是三角形,但为什么我不能明确地进行这个演员表?前向声明是否与问题有关?
【问题讨论】:
triangle = (Triangle*)shape
你到底想在 Shapeshift 中做什么?
@Barry 只是了解语法和语义,真的。对于你和不能用前向声明做的事情,我没有规定所有的规则,我不知道我是否被允许做我尝试过的事情。
@wootscootinboogie 什么的语法?您是否尝试将triangle
分配给shape
? shape
到 triangle
? pShape
参与了吗?
我会考虑跳过 ShapeShift
方法中的 shiftTo
参数,因为它可能是多余的。你想变形的类型可以直接从传入的shape
的类型推断出来。使用typeid()
推断这个属性。
【参考方案1】:
我试图将传递给 Shapeshift 方法的 Shape 类型更改为与同一函数中的字符串参数匹配的指针
安全演员是dynamic_cast
:
dynamic_cast<Triangle*>(shape);
如果shape
是Triangle*
,这将成功并且表达式的结果将是一个有效的指针。否则,它将是一个空指针。
不安全的演员表是static_cast
:
static_cast<Triangle*>(shape);
如果shape
碰巧不是Triangle*
,这将是未定义的行为,但无论如何都是非空指针(只要shape
是非空的)。
【讨论】:
请注意,dynamic_cast<>
仅适用于与继承相关的多态类型,问题中都不清楚。【参考方案2】:
由于(Triangle *)shape
不是可修改的左值,因此您不能为其赋值。
你可能想做的是
triangle = (Triangle*)shape;
不要使用 C 样式转换,因为它们可以防止您遇到多个运行时错误。
在这种情况下最好使用dynamic_cast
。
【讨论】:
不要在 C++ 中使用 C 风格的强制转换。 @DDrmmr 是的,谢谢。由于巴里的回答,我认为这很明显。以上是关于将前向声明的指针转换为更具体的类型的主要内容,如果未能解决你的问题,请参考以下文章