c++ - “new”不调用类中指定的构造函数?
问题描述
我对new
operator的理解一定有一些缺陷。
这是代码的相关部分:
#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
。
如何让new
运算符调用我编写的构造函数?
解决方案
您的代码在构造函数的主体内声明局部变量。正确的方法是使用构造函数的成员初始化列表:
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);
推荐阅读
- php - 如何使用 PHP 删除字符串中特定字符的重复项
- rest-assured - 如何使用 selenium 在 Rest Assured 的 Post 请求中设置安全/授权令牌
- logging - 如何在 JBOSS 7 上允许 console.log 的轮换
- sql - 查询结果中不显示当前语言环境的小数
- c# - 如何获取登录用户的联合令牌 - Razor 站点 c#
- angularjs - 如何使用量角器使用 formGroup 或 ngif 元素测试登录应用程序的验证消息?
- c++ - 可以在 C++ 中将数据永久存储到文本文件中
- python - 在 Linux 中 grep ppid 1 进程的 Python 脚本
- java - 如何检测 Admob 插页式广告被用户点击?
- android - 如何检索部署在用 Delphi 编写的 Android 应用程序中的文件