2012-10-23 45 views
0

我有一個指向我將在一種方法中使用的對象。但我需要在另一個方法中再次使用相同的指針,我怎樣才能實現這個沒有聲明爲全局對象。這是我動態biding成就的一部分 Shape是父類,Rectangle是子類。如何使用指向另一個函數中某個函數的對象的指針?

int main(){ 
switch (choice){ 
case 1: 
create(); 
break; 
case 2: 
process(); 
break; 
} 
} 

create(){ 
Shape *shape[3]; 
shape[0]=&objRectangle; 
} 

process(){ 
for(int i=0;i<3;i++){ 
shape->print; // I want to acchieve like this. 
} 

現在我不能做這個原因,形狀對象一旦退出創建過程就消失了。 請協助。

+0

請發佈代碼,即使大約編譯。否則很難幫助你。 – pmr

+1

@pmr他希望「形​​狀」數組在其聲明的範圍內生效;他只需要'vector'或'new []'。 –

+0

@SethCarnegie但顯然他甚至不知道如何遍歷數組。向他展示'新'會很瘋狂。 – pmr

回答

1

我會建議,像其他人一樣,讓圖書館爲您管理內存。

爲了能夠使用動態綁定和std::vector你應該開始分配(在主)的向量作爲

std::vector<Shape*> shape(3); 

這樣做,你可以訪問您的動態綁定的矢量條目

shape[0]->process(); 

不好的一面是你仍然需要管理矢量條目指向的內存(實際上它們只是C指針)。因此,你爲什麼不考慮做

std::vector< std::tr1::shared_ptr<Shape> > shape(3); 

通過這種方式,smart pointerstd::tr1::shared_ptr將爲指定的Shape對象超出範圍時釋放內存。

而且,在此設置,您應該分配Shape型對象作爲

 shape[0] = std::tr1::shared_ptr<Shape>(new Rectangle); 

正確地創建你所需要的智能指針。

最後,矢量shape應該通過引用(或const引用)傳遞給使用它的函數。

+0

謝謝,我會試試這個方法。 – rasul1719435

1

局部變量在call stack上創建。這意味着這些變量總是在函數結束時被銷燬。

目前還不清楚如何檢索Rectangle對象,以及如何處理來自所粘貼代碼的Shape對象指針的數組。但你可能需要兩件事:

  1. 你的Rectangle不能在堆棧上,但它必須分配在堆上。
  2. 您需要在所有要訪問的地方訪問shape陣列。

我會建議你使用動態newdelete關鍵字來創建一個類,將包裹你的功能,並有實例化和刪除Shape對象。我相信這是最簡單的方法。像這樣的東西應該工作:

/* interface */ 

class Example 
{ 
    Shape *shape[3]; 

    public: 

    Example(); 
    ~Example(); 

    void create(); 
    void process(); 
}; 

/* implementation */ 

Example::Example() {} 

Example::~Example() 
{ 
    delete shape[0]; 
} 

void Example::create() 
{ 
    shape[0] = new Rectangle(); 
} 

void Example::process() 
{ 
    shape[0]->print(); 
} 

/* main */ 

int main() 
{ 
    Example example(); 
    example.create(); 
    example.process(); 
} 
+0

這個解決方案也不對。 'example'是堆棧分配的,應該使用'Example example'來初始化。 – Acorbe

+0

對不起,在完成之前我錯誤地提交了答案。我相信現在是正確的。當然,'例子'分配在堆棧上。我認爲問題出在'Rectangle'對象上。 –

+0

@JanVčelák我不能使用referrencem&訪問項目。 – rasul1719435

相關問題