2013-06-26 46 views
0

想象的情況下,我有一些類:C++的指針轉換爲類到一個類

class MyClass{ 
    public: 
     MyClass(unsigned int N): a(new double[N]){}; 
     ~MyClass(){delete[] a;}; 

    private: 
     double* a; 
} 

在另一類,我使用一個指向這個類:

class MyOtherClass{ 
    public: 
     MyOtherClass(unsigned int N):p(new MyClass(N)){}; 
     ~MyOtherClass(){delete p;}; 

     MyClass* get_MyClass(){return p;}; 

    private: 
     MyClass *p; 
} 

然後在主,我需要獲得MyClass的載於MyOtherClass

int main(){ 
    MyOtherClass moc(1e100); 
    MyClass mc; 

    mc <-> moc.get_MyClass(); 
} 

<->就是我卡住了。我希望mc成爲p指向但不復制(巨大)靜態數組。有沒有辦法有效地進行這種轉換?

編輯

謝謝您的回答,但我會精確的事情。作爲消費MyClass的副本時部來自於靜態數組的副本,我以爲我可以這樣做:

class MyClass{ 
    public: 
     MyClass(unsigned int N): a(new double[N]),del(true){}; 
     MyClass(MyClass* mc): a(mc.get_a()),del(true){}; 
     ~MyClass(){if(del){delete[] a;}}; 

     double* get_a(){ 
      del = false; 
      return a; 
     } 

    private: 
     double* a; 
     bool del; 
} 

與主:

int main(){ 
    MyOtherClass moc(1e100); 
    MyClass mc(moc.get_MyClass()); 
} 

,但我不知道我是否有內存泄漏...

回答

1

假設你想要p內容被銷燬,請爲MyClass寫一個移動構造函數。

一般來說,像你一樣存儲原始指針一般是有問題的。如果你使用vector<double>來代替,整個任務將變得更容易,因爲在這種方法中,不必要地使用指針只會增加你的問題。

這就是我想要做的:

class MyClass{ 
    std::vector<double> a; 
public: 
    MyClass(unsigned int N): a(N) { } 
    // no destructor! 
}; 

class MyOtherClass{ 
    MyClass p; 
public: 
    MyOtherClass(unsigned int N) : p(N) {}; 
    // no destructor!! 

    MyClass& getMyClass() { return p; }; 
} 

現在可以清楚地看到,你不能只用getMyClass初始化新MyClass沒有複製,因爲它是一個參考。但是,如果你確信你不會需要在以後使用MyOtherClass,或者你只是想「偷」的數據,你應該能夠安全地move出來的MyOtherClass

MyClass(MyClass&& other) : a(std::move(other.a)) { 
    // now, I am not sure what will be left in other.a, but you can clean it up 
    // (you can because it's in valid, only undefined state) 
    other.a = std::vector<double>(); 
} 

如果你是對竊取數據不感興趣,但想要訪問它,像其他人所建議的那樣使用參考。

+0

感謝,但我必須使用靜態數組...我使用的代碼已經開發了別人,我不能承受一切的重寫。 ..但是,是的,我想要的是「竊取」數據... – PinkFloyd

0

你應該的

MyClass* get_MyClass(){return p;}; 

返回類型更改爲

MyClass& get_MyClass(){return p;}; 

,因爲你所描述的似乎是這個函數的主要用途。

MyClass& mc = moc.get_MyClass(); 
+1

小心:兩者不完全相同。 – juanchopanza

+0

@juanchopanza請你告訴我不同​​之處,因爲我似乎找不到任何東西? – Jerska

+0

@Jerska第一個將調用MyClass的拷貝構造函數。 –

2

使用參考:

然後,只需用檢索實例

int main(){ 
    MyOtherClass moc(1e100); 
    MyClass& mc = *moc.get_MyClass(); 
} 

參照可以避開復制,仍然避免使用指針語法。

0

根據你的代碼,double* MyClass::a;陣列不能因爲默認的拷貝構造函數的複製/複製操作執行只是重新分配的指針;

您應該使用智能指針來包裝你double* MyClass::a變量,以使引用計數和防止在析構函數內同一地址執行delete運算符的兩倍。

您應該導航到this article和了解。

如何使用智能指針使用數組,你可以發現here

相關問題