"new" не вызывает указанный конструктор в классе? - PullRequest
0 голосов
/ 04 сентября 2018

В моих представлениях об операторе new должны быть некоторые недостатки.

Вот соответствующая часть кода:

#include <queue>

using namespace std;

class MovingAverage {
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        queue<double> q;
        int max_size = size;
        int curr_size = 0;
        double sum = 0.0;
    }

private:
    queue<double> q;
    int curr_size;
    int max_size;
    double sum;
};

int main(){
    MovingAverage * m = new MovingAverage(3);  // This line does not work as expected!
    return 0;
}

В приведенном выше коде класс MovingAverage имеет конструктор MovingAverage(int size), который устанавливает две из его переменных-членов curr_size и sum в ноль.

Однако строка MovingAverage * m = new MovingAverage(3); в главной функции не возвращает указатель на экземпляр класса с двумя членами curr_size и sum, равными нулю.

Вместо этого отладчик показывает, что созданный объект имеет curr_size = 1953853300 и max_size = 6647401.

enter image description here

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

1 Ответ

0 голосов
/ 04 сентября 2018

Ваш код объявляет локальные переменные внутри тела конструктора. Правильный подход - использовать список инициализатора конструктора :

MovingAverage(int size):
    max_size(size),
    curr_size(0),
    sum(0.0)
{}

Кроме того, в идеале вы не должны использовать подобные указатели. Существуют классы интеллектуальных указателей, такие как std :: unique_ptr и std :: shared_ptr , которые могут сделать код более безопасным и простым в обслуживании. Таким образом, ваш код может быть:

#include <memory>

...
auto m = std::make_unique<MovingAverage>(3);

или

auto m = std::make_shared<MovingAverage>(3);
...