将前向声明的指针转换为更具体的类型

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 分配给shapeshapetrianglepShape 参与了吗? 我会考虑跳过 ShapeShift 方法中的 shiftTo 参数,因为它可能是多余的。你想变形的类型可以直接从传入的shape的类型推断出来。使用typeid()推断这个属性。 【参考方案1】:

我试图将传递给 Shapeshift 方法的 Shape 类型更改为与同一函数中的字符串参数匹配的指针

安全演员是dynamic_cast:

dynamic_cast<Triangle*>(shape);

如果shapeTriangle*,这将成功并且表达式的结果将是一个有效的指针。否则,它将是一个空指针。

不安全的演员表是static_cast:

static_cast<Triangle*>(shape);

如果shape 碰巧不是Triangle*,这将是未定义的行为,但无论如何都是非空指针(只要shape 是非空的)。

【讨论】:

请注意,dynamic_cast&lt;&gt; 仅适用于与继承相关的多态类型,问题中都不清楚。【参考方案2】:

由于(Triangle *)shape 不是可修改的左值,因此您不能为其赋值。 你可能想做的是

triangle = (Triangle*)shape;

不要使用 C 样式转换,因为它们可以防止您遇到多个运行时错误。 在这种情况下最好使用dynamic_cast

【讨论】:

不要在 C++ 中使用 C 风格的强制转换。 @DDrmmr 是的,谢谢。由于巴里的回答,我认为这很明显。

以上是关于将前向声明的指针转换为更具体的类型的主要内容,如果未能解决你的问题,请参考以下文章

为什么伪元素内容不被更具体的声明代替?

20210421-C++的前向声明

为啥我不能只用前向声明 C++ 声明一个类的静态成员?

boost 变体可以安全地与指向前向声明类的指针一起使用吗?

前向声明 boost.type_erasure 引用类型

结构体的一些容易被忽略的重要知识