gpt4 book ai didi

C++ std::valarray 成员变量意外更改

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:05 24 4
gpt4 key购买 nike

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

顺便说一句,我的 getter 和 setter 可能有问题,我刚刚开始在 C++ 的上下文环境中使用 SO question和来自 Stroustrup's The C++ Programming Language18.3.5 访问器函数 .

Stroustrup 的 constexpr double real() const { return re; 格式} 是我的例子最终使用的,但是没有 constexpr 因为我的类(class)不喜欢它(我试图理解 why 但仍然没有得到它) .

关于 accepted answer 的评论用户提出我的问题 deideistd::valarray 是“动态的”,我想这意味着你可以调整它的大小。当涉及到内存时,这可能会带来问题,我认为我的值(value)观可能由于这个事实而以某种方式被覆盖。

#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]:(灵感来自 answer to my previous question,适合那些在家玩的人)

最佳答案

My understanding was that since the constructor takes b and c as arguments then they will be assigned to member variables of the same name

这是不正确的。您可以通过成员初始化列表、默认初始化或直接在构造函数体中赋值来初始化成员变量。例如:

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;
...

您没有执行上述任何操作,因此您的 intvalaray 的大小为 0。当您返回其拷贝并尝试访问不存在的元素时

// returns a random large number such as 26618992

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

关于C++ std::valarray 成员变量意外更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50842964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com