2014-10-09 74 views
0

我有以下情況。無法訪問C++中的數組元素

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 ::向量測試,我填補載體雙*和第二元件雙[]但在輸出我得到0值。但正如在類A的setData方法中添加了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

'data1'超出範圍並且指針變爲懸掛。 – Angew 2014-10-09 11:31:32

回答

1

當你推data1,你實際上是推着指針的data1的第一個元素(還有在該點的隱式轉換)。

由於data1是該函數的本地函數,只要setData返回,該指針就會變爲無效。

您還需要使用動態分配,或將vector存儲在您的vector中。

在矢量
+0

你的意思是我必須使用std :: vector >? – 2014-10-09 11:38:51

+0

@ D'JayPatil我的意思是你可以。這比手動分配內存更容易。 – molbdnilo 2014-10-09 11:48:51

1

double data1[] = {1};是本地setData(),後setData出口得到破壞,內部矢量內容變得晃來晃去。

用途:

double *data1 = new double (1.0); 

再次setData()看到2

+0

如果我使用新的(動態分配)是否有任何內存泄漏在這個程序如果是的話,我怎麼可以避免? – 2014-10-09 11:41:55

+0

@ D'JayPatil Ouhh是的,忘了提及,你應該釋放內存,你可以在析構函數中做 – P0W 2014-10-09 11:45:12

0

第二個元素是垃圾值在調用B-> displaySum的(a)爲第二元件被提及的本地變量

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

輸出:

  • 數據在0:1.000000
  • 數據在1:1.000000
  • 薩姆是:2.000000

Live Demo

+0

我想添加數組而不是數組元素例如我我的代碼我使用的是數組中的100個元素 – 2014-10-09 12:03:49

+0

在我的代碼中,我添加了單個數組元素,這在技術上意味着添加整個數組。如果我在這裏錯了,請讓我知道嗎? – SlashDot 2014-10-09 12:07:23

+0

假設如果我有10個陣列與100個尺寸根據您的建議,如果我添加矢量中的所有元素,然後矢量大小將爲10 * 100。如果我添加數組,那麼它的大小將是10這是我的想法! – 2014-10-09 12:15:05