首页 > 解决方案 > C++ std::valarray 成员变量意外更改

问题描述

我有一个类A,其构造函数将其参数之一作为std::valarray [^1],但是我发现一旦构造函数完成,它的值就会变为大随机数。

顺便说一句,我的 getter 和 setter 可能存在问题,在这个SO questionStroustrup 的 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]:(灵感来自我之前的问题的答案,适合那些在家玩的人)

标签: c++

解决方案


我的理解是,由于构造函数将 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

你从内存中得到一些垃圾值。


推荐阅读