首页 > 解决方案 > “new”不调用类中指定的构造函数?

问题描述

我对newoperator的理解一定有一些缺陷。

这是代码的相关部分:

#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_sizesum

但是,MovingAverage * m = new MovingAverage(3);主函数中的行不返回指向具有两个成员curr_sizesum零的类的实例的指针。

相反,调试器显示创建的对象具有curr_size = 1953853300max_size = 6647401

在此处输入图像描述

如何让new运算符调用我编写的构造函数?

标签: c++classnew-operator

解决方案


您的代码在构造函数的主体内声明局部变量。正确的方法是使用构造函数的成员初始化列表

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

除此之外,理想情况下你不应该使用这样的原始指针。有像std::unique_ptrstd::shared_ptr这样的智能指针类可以使代码更安全、更易于维护。所以你的代码可能是:

#include <memory>

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

或者

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

推荐阅读