我有以下情况。
class A
{
public:
std::vector<double *> getData()
{
return test;
}
void setData()
{
double * data = new double[1];
data[0] = 1;
double data1[] = {1};
test.push_back(data); // Pushing first element as double *
test.push_back(data1); // Pushing second element as double[]
}
private:
std::vector<double*> test;
};
class B
{
public :
void displaySum(A *a)
{
std::vector<double *> data = a->getData();
double sum = 0.0;
for(int i = 0; i < data.size(); i++)
{
printf("Data at %d : %f \n", i, data[i][0]); // Getting 0 for second element
sum = sum + data[i][0];
}
printf("Sum is : %f \n", sum);
}
};
int main()
{
A *a = new A();
a->setData();
B *b = new B();
b->displaySum(a);
return 0;
}
在A类中有成员变量std :: vector test,我用double *和double []填充向量但是在输出中我得到第二个元素的0值。但是在类A中,setData方法a添加了double [] = {1}。所以在输出中我应该在第二个元素得到1。请帮忙 。难道我做错了什么。如果请解释我。 谢谢!
OUTPUT ::
Data at 0 : 1.000000 // First Element
Data at 1 : 0.000000 // Second Element ->should be 1
Sum is : 1.000000 // Sum should be 2
答案 0 :(得分:1)
double data1[] = {1};
位于setData()
的本地,在setData
退出后被销毁,内部的内容变得悬空。
使用:
double *data1 = new double (1.0);
再次在setData()
中查看2
答案 1 :(得分:1)
当您按data1
时,您实际上是在向data1
的第一个元素推送指针(那时隐含转换)。
由于data1
是函数的本地函数,因此只要setData
返回,该指针就会变为无效。
您也需要使用动态分配,或将vector
存储在vector
中。
答案 2 :(得分:1)
从我解释的代码中,代码应该能够添加数组以及单个双数据,因此可以使用vector<double *>
代替vector <double>
而不是#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
std::vector<double> getData()
{
return test;
}
void setData()
{
double data = 1.00;
double data1[] = {1.00};
test.push_back(data); // Pushing first element as double
// Pushing second element as double[]
for(int i = 0; i < 1 /* Provide array size here */; i ++)
{
test.push_back(data1[i]);
}
}
private:
std::vector<double> test;
};
class B
{
public :
void displaySum(A *a)
{
std::vector<double> data = a->getData();
double sum = 0.0;
for(int i = 0; i < data.size(); i++)
{
printf("Data at %d : %f \n", i, data[i]); // Getting 0 for second element
sum = sum + data[i];
}
printf("Sum is : %f \n", sum);
}
};
int main()
{
A *a = new A();
a->setData();
B *b = new B();
b->displaySum(a);
return 0;
}
。
{{1}}
<强>输出:强>
<强> Live Demo 强>
答案 3 :(得分:0)
向量中的第二个元素是垃圾值,而调用b-&gt; displaySum(a)作为第二个元素是引用局部变量