【问题标题】:Error when casting a reference parameter with dynamic_cast in C++在 C++ 中使用 dynamic_cast 强制转换引用参数时出错
【发布时间】:2018-11-05 22:04:33
【问题描述】:

我正在学习 Robert C. Martin 的《敏捷软件开发》一书。 在关于开闭原则的示例中,我遇到了 dynamic_cast .

的问题

示例如下:

#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;

class Shape {
public:
    virtual void Drow() const = 0;
    virtual bool Precedes(const Shape & s) const = 0;

    bool operator<(const Shape &s){ return Precedes(s);};
};

template<typename T>
class Lessp {
public:
    bool operator()(const T i , const T j) {return (*i) < (*j);}
};


void DrowAllShape(vector<Shape*> &vect){

    vector<Shape*> list = vect;

    sort(list.begin(),
        list.end(),
        Lessp<Shape*>());

    vector<Shape*>::const_iterator i;

    for(i = list.begin(); i != list.end()  ;i++){
        (*i)->Drow();
    }
}

class Square : public Shape{
    public :
        virtual void Drow() const{};
        virtual bool Precedes(const Shape& s) const;
};

class Circle : public Shape{
    public :
    virtual void Drow() const{};
    virtual bool Precedes(const Shape& s) const;
};

bool Circle::Precedes(const Shape& s) const {
    if (dynamic_cast<Square*>(s)) // ERROR : 'const Shape' is not a pointer
        return true;
    else
        return false;

}

我在 Circle Precedes 的方法中遇到错误 有什么问题??

【问题讨论】:

  • 错误信息中有什么不清楚的地方? s 是对Shape 的常量引用,dynamic_cast 需要一个指针作为参数。你想写dynamic_cast&lt;Shape*&gt;(&amp;s);吗?
  • dynamic_cast&lt;Square*&gt;(s) -> dynamic_cast&lt;const Square*&gt;(&amp;s)。您也可以强制转换为 const ref dynamic_cast&lt;const Square&amp;&gt;(s),但您将获得的唯一失败指示是 bad_cast 异常。
  • 如果此列表来自一本书,则该书存在严重问题。

标签: c++ pointers casting reference open-closed-principle


【解决方案1】:

您可以使用dynamic_cast 来:

  1. 将一个指针投射到另一个指针(也需要const-正确)。
  2. 将引用投射到另一个引用(也需要const-正确)。

你不能用它来:

  1. 将指针转换为重新引用,或
  2. 将引用转换为指针。

因此,

dynamic_cast<Square*>(s)

错了。

你可以使用

if ( dynamic_cast<Square const*>(&s) ) 

解决编译器错误。

您可以使用 dynamic_cast&lt;Square const&amp;&gt;(s)(投射引用),但这需要 try/catch 块。

try 
{
    auto x = dynamic_cast<Square const&>(s);
}
catch ( std::bad_cast )
{
    return false;
}

// No exception thrown.
return true;

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 2012-03-17
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多