pointers — Ошибка при приведении ссылочного параметра с dynamic_cast в переполнении стека

Я изучаю книгу «Гибкая разработка программного обеспечения» Роберта С. Мартина.
В примере по принципу Open-Closed у меня была проблема с 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;

}

и я получаю ошибку в методе Precedes of Circle
в чем проблема ??

-2

Решение

Ты можешь использовать dynamic_cast чтобы:

  1. приведите указатель к другому указателю (должен быть const-также правильно).
  2. приведите ссылку на другую ссылку (необходимо const-также правильно).

Вы не можете использовать его для:

  1. навести указатель на ссылку, или
  2. приведите ссылку на указатель.

По этой причине,

dynamic_cast<Square*>(s)

неправильно.

Ты можешь использовать

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

разрешить ошибку компилятора.

Вы можете использовать использование dynamic_cast<Square const&>(s) (приведите ссылку), но это требует try/catch блок.

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

// No exception thrown.
return true;
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]