[英]Pointer to array object in c++
我是C ++的新手(來自Java),我想在一個類中聲明一個數組對象,但是它的模板參數需要一個整數值。 我想我必須要創建一個指向數組類的指針,但是它不起作用。
我想做類似的事情:
class foo{
private:
array *myArray;
public:
foo(int size){
//This line may be terribly wrong, but you see what I mean
myArray = new array<int,5>();
}
~foo(){
free(myArray);
}
}
但是,數組對象的正確初始化是:
array<int,5>
但是這種方式不允許我在運行時中選擇長度。
我強烈建議您拿起一本很好的C ++入門書 ,而忘了Java。 認真地講,在學習C ++時,用Java思考會適得其反。 它們可能具有相似的語法,但是它們具有非常不同的語義。
您遇到的問題與語言的基本概念有關。 在繼續之前,您必須從一本好的C ++入門書中學習基礎知識。
由於要在運行時選擇長度,因此std::array
(如果您正在使用的)不是用於此特定應用程序的正確類。 std::array
的大小在編譯時固定。
您應該改用std::vector
,它允許您在運行時指定(和更改)大小。
標准容器(例如std::vector
為您管理內存; 您不需要new
或delete
標准容器。 存在標准容器是因為您不必自己手動處理內存。
#include <vector>
class foo
{
private:
std::vector<int> myArray;
public:
foo(int size) : myArray(size) // Sets the size of the array
{
}
~foo()
{
// You don't need to delete anything; the vector takes care of itself.
}
};
注意,我在這里的任何地方都沒有使用指針new
, delete
, malloc()
或free()
。 在C ++中,很多情況下通常不需要指針 。 與流行的看法相反,使用現代C ++技術時,您實際上幾乎不需要執行手動內存管理。 實際上,如果在C ++代碼中使用delete
或free()
,則可能做錯了。
我想再次強調一本良好的C ++入門書對幫助您使用該語言的重要性。 任何優秀的C ++入門書籍都將介紹std::vector
以及如何利用它來發揮您的優勢。 其他資源, 例如std::vector
引用也可以提供幫助。 熟悉它們。
我相信您正在尋找的是vector
類。 它是一個類似數組的連續存儲結構(不錯的stackoverflow問題 ),是C數組的C ++替代方案。
您可以使用指針來完成此操作,但是由於vector
大小是動態增長的,因此它並不那么重要。
這是您的示例中的一個示例:
#include <vector>
class foo{
private:
std::vector<int> *vecPointer;
public:
foo(int size){
vecPointer = new std::vector<int>(size, 0);
// 0 as default value, can be omitted
}
~foo(){
delete vecPointer;
}
}
如果您只想保留內存,但在類初始化時實際上沒有任何元素,則可以選擇保留該內存,而不用具體的int
值填充它。 在這種情況下,構造函數將類似於:
foo::foo(int size){
vecPointer = new std::vector<int>();
vecPointer->reserve(size);
}
析構函數不會改變,並且在class foo
,您可以使用vecPointer->push_back(5)
將對象添加到保留的大小,並且可以以完全相同的方式添加更多的對象(僅在矢量大小之后)並且所需的內存將會增加)。
另外,您真的要使用指針嗎? 您不必這樣做,可以有一個法線向量:
#include <vector>
class foo{
private:
std::vector<int> vec;
public:
foo(int size){
vec.resize(size, 0); // it's initialized as empty here
// alternative, with reserve:
// vec.reserve(size);
}
~foo(){
// no deletion needed like this
}
}
這樣,一切都得到了照顧,您不必記住刪除。
foo(int size) {
myArray = new int[size]; // Allocate n ints and save ptr in a.
for (int i=0; i<size; i++) {
myArray[i] = 0; // Initialize all elements to zero.
}
其他答案很好地回答了這個問題(您不需要管理內存),但是假設您想自己管理內存(使用新的運算符),
然后使用唯一指針( 智能指針 )指向數組。
#include <memory>
class foo{
private:
std::unique_ptr<int> myArray;
public:
foo(int size){
myArray.reset(new int[5]);
}
~foo(){
}
}
您無需在這里釋放內存(就像向量一樣)。
但是請記住最好的解決方案是使用向量(如所指出的那樣),但是由於問題標題為“ Pointer to array”,因此我添加了一種巧妙地指向數組的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.