我有一个类A
,其构造函数作为std::valarray [^ 1]的参数之一,但是我发现构造函数完成后它的值会变为大的随机数。
顺便说一句,我的getter和setter可能会出现问题,我刚刚开始在C ++的cotext中使用SO question和来自Stroustrup's The C++ Programming Language的18.3.5 Accessor Functions
Stroustrup的constexpr double real() const { return re; }
格式是我的例子最终使用的,但没有constexpr
,因为我的班级不喜欢它(我试图理解why但仍然没有'得到了它。)
用户accepted answer对我的问题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] :(受answer to my previous question启发,适合那些在家里玩的人)
答案 0 :(得分:2)
我的理解是,因为构造函数将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
int
的{{1}}大小为0.当您返回其副本并尝试访问不存在的元素时
//返回一个随机大数,例如26618992
你从内存中获得了一些垃圾值。