Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

Tom asked in 電腦與網際網路程式設計 · 1 decade ago

class new

#include <iostream>

using namespace std;

class int_array_cell

{

private:

int _counter;

int * _memory;

};

class counter_ptr

{

public:

counter_ptr(char *,float *);

private:

char * _name;

int_array_cell * _cell_ptr;

};

counter_ptr::counter_ptr(char *name,float *cell_ptr){

this->_name=name;

}

void main()

{

counter_ptr b("b", new int[10]);

// stdout 輸出: int_array_cell is allocated

// stdout 輸出: counter_ptr b is assigned to an int_array_cell: counter 1

}

1﹒我寫了counter_ptr的建構者,其實我也不知道我這樣寫是對的還是錯的?因為main裡的new int[10]讓我感覺好奇怪...

2﹒我會把"b"傳給_name,可是int_array_cell * _cell_ptr;我就不懂怎麼寫了;因為沒辦法在counter_ptr的建構者裡動_memory,所以我就卡在這裡了,請幫我看看。

Update:

我想在int_array_cell裡刪除,我寫了

int_array_cell::~int_array_cell(){

this->_counter--;//當初設定為如果成功allocate就counter+1,所以這個時候會-1

delete [] this->_memory;

}

可是有一個地方我又不會了,就是因為我想要用~counter_ptr呼叫::~int_array_cell來刪除,所以我寫了

counter_ptr::~counter_ptr(){

this->_name=NULL;//把name刪掉

//可是再來的語法我就不會了

}

Update 2:

to Cloud

你回答的那this->_cell_ptr=new int_array_cell(cell_ptr);是怎麼知道要這樣寫的?我有去msdn查過new可是沒有看到.

Update 3:

我想到了~~~

1 Answer

Rating
  • Cloud
    Lv 4
    1 decade ago
    Favorite Answer

    1.

    counter_ptr b("b", new int[10]);

    你的建構子原型是(char *, float *)

    理論上這樣是沒辦法編譯過

    除非把建構子原型改為(char *, int *)

    那你main裡面的

    counter_ptr b("b", new int[10]);

    就會對應到正確的建構子

    這樣寫只不過是把new出來十個int空間位址丟進建構子參數

    但是有一點要注意的是

    "誰來刪除new出來的int[10]空間?"

    2.

    counter_ptr::counter_ptr(char *name,int *cell_ptr){

    this->_name=name;

    //可以這樣寫

    this->_cell_ptr=new int_array_cell(cell_ptr);

    }

    int_array_cell寫個建構子

    class int_array_cell

    {

    public:

    int_array_cell(int *cell_ptr);

    private:

    int _counter;

    int * _memory;

    };

    int_array_cell::int_array_cell(int *cell_ptr) :

    //成員變數初始

    _counter(0), _memory(cell_ptr)

    {

    }

    刪除丟進去的int[10]空間必須根據您的需求思考

    看是要在int_array_cell的解構子刪除

    或是在counter_ptr的解構子刪除

    假設這空間是在int_array_cell刪除

    就寫個解構子

    int_array_cell::~int_array_cell(void)

    {

    //new出來的陣列要加" [ ] "符號來刪除

    delete [] _memory;

    }

    2007-12-09 00:58:48 補充:

    counter_ptr::~counter_ptr(){

    this->_name=NULL;//把name刪掉

    //把int_array_cell物件刪除就會呼叫int_array_cell的解構子

    delete _cell_ptr;

    }

    this->_cell_ptr=new int_array_cell(cell_ptr);

    這段程式碼的意思是

    "new一個int_array_cell的物件呼叫的事int_array_cell(int *)建構子

    並將此物件的位址儲存在成員變數_cell_ptr裡"

    這個不可能在MSDN找到........因為這是C++的基本程式語法

    建議可以翻閱C++ Primer這本書

    2007-12-09 01:00:23 補充:

    不可能找到的原因還有這是你自訂的類別

    微軟的MSDN不可能查的到你的自訂類別........因為那是你自己寫的

    Source(s): 自己
Still have questions? Get your answers by asking now.