c++ - C++ std::valarray 成员变量意外更改
问题描述
我有一个类A
,其构造函数将其参数之一作为std::valarray [^1],但是我发现一旦构造函数完成,它的值就会变为大随机数。
顺便说一句,我的 getter 和 setter 可能存在问题,在这个SO question和Stroustrup 的 The C++ Programming Language18.3.5 Accessor Functions
的帮助下,我刚刚开始在 C++ 的上下文中使用它们。
Stroustrup 的格式constexpr double real() const { return re; }
是我的示例最终使用的格式,但是没有,constexpr
因为我的班级不喜欢它(我试图理解为什么但还没有得到它)。
用户deidei对我的问题接受的答案的评论说这是“动态的”,我想这意味着您可以调整它的大小。当涉及到记忆时,这可能会带来问题,我认为我的价值观可能会因为这个事实而以某种方式被覆盖。std::valarray
#include <iostream>
#include <valarray>
#include <vector>
class A
{
public:
A(std::valarray<int> b, std::vector<int> c)
{
std::cout<< b[0] << std::endl;
};
std::valarray<int> get_b() const {return b;};
std::vector<int> get_c() const {return c;};
private:
std::valarray<int> b;
std::vector<int> c;
};
int main()
{
std::valarray<int> b = {1, 3};
std::vector<int> c = {4, 2, 8, 17};
A a(b,c);
std::cout<< a.get_b()[0] << std::endl; // returns a random large number such as 26618992
return 0;
}
什么问题可能导致此问题?
[^1]:(灵感来自我之前的问题的答案,适合那些在家玩的人)
解决方案
我的理解是,由于构造函数将 b 和 c 作为参数,因此它们将被分配给同名的成员变量
这是不正确的。您可以通过成员初始化器列表、默认初始化或直接在构造函数体中赋值来初始化成员变量。例如:
A(std::valarray<int> b, std::vector<int> c)
: b(b), c(c)
{...
或者
private:
std::valarray<int> b = {1, 3};
std::vector<int> c = {4, 2, 8, 17};
或者
A(std::valarray<int> b, std::vector<int> c)
{
this->b = b;
this->c = c;
...
您没有执行上述任何操作,因此您valaray
的 ofint
的大小为 0。当您返回其副本并尝试访问不存在的元素时
// 返回一个随机的大数,例如 26618992
你从内存中得到一些垃圾值。
推荐阅读
- ios - 使用打开按钮从试飞中打开应用程序时在启动时崩溃
- matlab - 如何在 MATLAB 中使用点生成圆顶
- amazon-web-services - AWS ECS 容量提供商
- c# - 将参数传递给 C# 中的 .cmd 文件
- spring - Spring @RequestBody 是如何工作的?以及@RequestBody 如何映射 json 来自定义对象?
- javascript - 如果在移动设备中打开菜单,如何停止正文滚动?
- java - Flink 原始和托管状态。什么时候使用它们?
- r - 用 ggplot 和 2 个过滤器叠加 2 个条形图
- c# - 如何为外出请求 ASP.net c# 添加动态标头?
- laravel - 使用 \Mail::send 不能设置标题