无法在c ++中访问Array的元素

时间:2014-10-09 11:24:25

标签: c++ arrays stdvector

我有以下情况。

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

4 个答案:

答案 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}}

<强>输出:

  • 数据0:1.000000
  • 数据1:1.000000
  • 总和是:2.000000

<强> Live Demo

答案 3 :(得分:0)

向量中的第二个元素是垃圾值,而调用b-&gt; displaySum(a)作为第二个元素是引用局部变量