Как мне переключить это на unique_ptr? - PullRequest
0 голосов
/ 25 августа 2018

Как мне сделать так, чтобы мне не пришлось вручную удалять указатель?

С unique_ptr в vector<>?

Вот мой код:

class vec2 {
 public:
  double x;
  double y;

  vec2() {
    x = 0.0;
    y = 0.0;
  }

  vec2(double xx, double yy) {
    x = xx;
    y = yy;
    cout << "constructor called" << endl;
  }

  ~vec2() {
    static int count = 0;
    cout << "destructor " << count << endl;
    count++;
  }

  virtual double Length() { return sqrt(x * x + y * y); }

  bool operator==(vec2& v) { return x == v.x && y == v.y; }

  virtual string toString() {
    stringstream s("");
    s << "[" << x << " " << y << "]";
    return s.str();
  }
};

int main() {
  vector<vec2*> vecs;
  vecs.push_back(new vec2(1.8, 1.7));
  vecs.push_back(new vec2(1.99, 1.7));
  for (vec2* v : vecs) {
    cout << v->toString() << endl;
    delete v;
  }
}

http://www.xgdev.com/notepad/textfiles/37631a.txt

1 Ответ

0 голосов
/ 25 августа 2018

Простой:

std::vector<std::unique_ptr<vec2>> vecs;
vecs.reserve(2);   // Optional
vecs.push_back(std::make_unique<vec2>(1.8 ,1.7));
vecs.push_back(std::make_unique<vec2>(1.99, 1.7));
for (auto& v : vecs) {
    cout << v->toString() << endl;
}

Если у вас есть virtual функции-члена (й), скорее всего, деструктор также должен быть virtual.

...