инициализировать (выделить) базовый класс shared_ptr с производным классом - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть классы форм, и в базовом классе у меня есть перегрузки постфиксных и префиксных операторов как чисто виртуальных.

class Shape
{
public:
  virtual Shape& operator ++()=0;
  virtual shared_ptr<Shape> operator++(int)=0;
  virtual void showPos()const =0;
};

class Circle : public Shape
{
public:
  virtual Shape& operator ++() override; 
  virtual shared_ptr<Shape> operator ++(int) override;
  virtual void showPos()const override;
private:
  int x=0,y=0;
};

Нет проблем с перегрузками префиксных операторов.В postfix мне нужно вернуть временную переменную, но я не могу создать экземпляр абстрактного базового класса, поэтому я решил использовать shared_ptr в качестве интеллектуального указателя.

void
Circle::showPos()const{ 
  cout << "X:"<< x <<", Y:"<<y <<endl;
  return;
}

Shape&
Circle::operator ++() {
  ++x;
  ++y;
  return *this;
}

shared_ptr<Shape>
Circle::operator ++(int) {
  shared_ptr<Shape> temp (Circle(*this));
  ++x;
  ++y;
  return temp;
}

int main()
{
  Circle myCircle;  

  myCircle.showPos(); //must be | X:0, Y:0
  (myCircle++)->showPos();//must be | X:0, Y:0 (now x=1,y=1)
  (myCircle++)->showPos(); //must be | X:1, Y:1 (now x=2,y=2)
  return 0;
}

Реализация находится в том же файле и, как указано выше.И ошибка:

main.cpp:38:40: error: no matching function for call to
'std::shared_ptr<Shape>::shared_ptr(Circle)'
shared_ptr<Shape> temp (Circle(*this));

Как мне использовать shared_ptr?

...