如何將數組定義爲類的成員,同時將其大小確定在其他位置並實際傳遞給構造函數。在一個類中定義一個數組,但大小是在構造函數中確定的
更多詳細信息: 有一個整數的數組,並定義在類中的公共成員。
class foo {
public:
int *arr[];
int s;
};
但是,數組的大小在構造函數中傳遞。
foo::foo()
: s (array_size)
{
}
做這種事情的正確語法是什麼?
如何將數組定義爲類的成員,同時將其大小確定在其他位置並實際傳遞給構造函數。在一個類中定義一個數組,但大小是在構造函數中確定的
更多詳細信息: 有一個整數的數組,並定義在類中的公共成員。
class foo {
public:
int *arr[];
int s;
};
但是,數組的大小在構造函數中傳遞。
foo::foo()
: s (array_size)
{
}
做這種事情的正確語法是什麼?
這樣做的正確方法是使用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。更多建議:
_
)。那麼首先,不知道爲什麼你要使用一個int指針數組,但我是誰來質疑你的設計。任何人,你都可以用指針和動態分配來做到這一點。聲明您的數組爲...
int **arr;
,並在構造函數初始化因爲它..
*arr = new int*[s];
記得用delete[]
把它清理乾淨的析構函數。另一種方法是使用std::vector<int*>
class foo {
public:
std::vector m_vec;
foo(uint32_t size) : m_vec(size) { }
};
正如你所建議的,你的班級似乎試圖定義一個'指向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) { }
};
你並不需要顯式存儲的大小;該矢量爲你做。
這意味着int數組而不是指向int的指針數組。對? – mahmood 2012-02-28 14:20:06
如果你打算建議手動分配,你應該提到[Rule of Three](http://stackoverflow.com/questions/4172722)。 – 2012-02-28 14:21:00
是(這是一個'int'數組)。我假設你想要的是一個'int'數組,正如你在問題中所陳述的那樣,而不是像其他人似乎假設的那樣,根據你的類代碼中使用的符號,看起來像是一個指向'int'的指針數組。 – 2012-02-28 14:22:09
我想以簡單的方式爲數組建立索引。像「arr [i] = 1;」 – mahmood 2012-02-28 14:08:55
@mahmood vector實現'operator []' - 你可以使用下標元素訪問,就像原始數組一樣。作爲獎勵,'vector'增加了額外的錯誤檢測和便利功能。它管理你的計數和重新分配。在那裏沒有損失;) – justin 2012-02-28 14:12:09
使用'vector',我不得不推遲到最後。或者我必須使用'insert()'。但是,第一個參數是一個迭代器。所以'v.insert(i,1);'不起作用 – mahmood 2012-02-28 14:15:48