簡體   English   中英

指向C ++中數組對象的指針

[英]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為您管理內存; 您不需要newdelete標准容器。 存在標准容器是因為您不必自己手動處理內存。

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

注意,我在這里的任何地方都沒有使用指針newdeletemalloc()free() 在C ++中,很多情況下通常不需要指針 與流行的看法相反,使用現代C ++技術時,您實際上幾乎不需要執行手動內存管理。 實際上,如果在C ++代碼中使用deletefree() ,則可能做錯了。

我想再次強調一本良好的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM