2012-02-28 38 views
1

如何將數組定義爲類的成員,同時將其大小確定在其他位置並實際傳遞給構造函數。在一個類中定義一個數組,但大小是在構造函數中確定的

更多詳細信息: 有一個整數的數組,並定義在類中的公共成員。

class foo { 
    public: 
    int *arr[]; 
    int s; 
}; 

但是,數組的大小在構造函數中傳遞。

foo::foo() 
     : s (array_size) 
{ 
} 

做這種事情的正確語法是什麼?

回答

3

這樣做的正確方法是使用STL和std::vector<int>來執行此類任務。下面是一個粗略的輪廓可以爲你工作:

#include <vector> 

... 

class foo 
{ 
    public: 
     std::vector<int> arr_; 

     ... 

     foo(const int* numbers, int numberCount) 
     : arr_(numbers, numbers+numberCount) 
     { 
     } 

     ... 

     int size() const 
     { 
      return arr_.size(); 
     } 

     ... 

     int& operator [] (int index) 
     { 
      return arr_.at(index); 
     } 
}; 

在載體的進一步信息可以發現here。更多建議:

  • 如果沒有令人信服的理由,則不要公開您的實例變量。
  • 名稱實例變量以某種方式特別(例如通過附加_)。
  • 很多人不喜歡被命名爲全部小寫的類。
+0

我想以簡單的方式爲數組建立索引。像「arr [i] = 1;」 – mahmood 2012-02-28 14:08:55

+1

@mahmood vector實現'operator []' - 你可以使用下標元素訪問,就像原始數組一樣。作爲獎勵,'vector'增加了額外的錯誤檢測和便利功能。它管理你的計數和重新分配。在那裏沒有損失;) – justin 2012-02-28 14:12:09

+0

使用'vector',我不得不推遲到最後。或者我必須使用'insert()'。但是,第一個參數是一個迭代器。所以'v.insert(i,1);'不起作用 – mahmood 2012-02-28 14:15:48

1

那麼首先,不知道爲什麼你要使用一個int指針數組,但我是誰來質疑你的設計。任何人,你都可以用指針和動態分配來做到這一點。聲明您的數組爲...

int **arr; 

,並在構造函數初始化因爲它..

*arr = new int*[s]; 

記得用delete[]把它清理乾淨的析構函數。另一種方法是使用std::vector<int*>

1

也許這是不是你想要什麼,但我會用一個模板參數做

template<int T> 
class Foo 
{ 
    public: 
    int array[T]; 
    int s; 
}; 

您實例化這個類像

Foo<1024> * f = new Foo<1024>(); 
+0

哇,狗屎的人,這實際上工作? O_o – MGZero 2012-02-28 14:14:02

+2

那不需要是模板? – BoBTFish 2012-02-28 14:15:39

+0

是的,這是一個非類型的模板參數。除非該編號在編譯類型中是已知的,否則這將不起作用。 – 2012-02-28 14:18:58

0
class foo { 
    public: 
    std::vector m_vec; 
    foo(uint32_t size) : m_vec(size) { } 
}; 
3

正如你所建議的,你的班級似乎試圖定義一個'指向int'的數組,而不是一組int。然而,經典的答案正是你使用'指向int'的指針,並在構造函數中分配數組,然後釋放它到析構函數中。第一近似:

class foo 
{ 
public: 
    int *arr; 
    int s; 
    foo(int sz) : s(sz) { arr = new int [s]; } 
    ~foo()    { delete [] arr; } 
}; 

如果你要沿着這條路走下去,你還需要提供一個賦值操作符和拷貝構造函數(如Mike Seymour讓我想起了 - 謝謝,邁克);編譯器會爲你自己編寫的默認版本是錯誤的 - 可怕的是錯誤的。 (SO問題"What is the Rule of Three?"涵蓋了這一點。)

然而,這是(可能)不例外安全,你會被建議使用std::vector<int>,而不是一個普通的指針:

class foo 
{ 
public: 
    std::vector<int> arr; 
    foo(int sz) : arr(sz) { } 
}; 

你並不需要顯式存儲的大小;該矢量爲你做。

+0

這意味着int數組而不是指向int的指針數組。對? – mahmood 2012-02-28 14:20:06

+0

如果你打算建議手動分配,你應該提到[Rule of Three](http://stackoverflow.com/questions/4172722)。 – 2012-02-28 14:21:00

+0

是(這是一個'int'數組)。我假設你想要的是一個'int'數組,正如你在問題中所陳述的那樣,而不是像其他人似乎假設的那樣,根據你的類代碼中使用的符號,看起來像是一個指向'int'的指針數組。 – 2012-02-28 14:22:09

相關問題