2017-02-19 109 views
0

我有一個類,其中包含一個私人指針結構(這是託管的C + +和結構是本地的)。這個指針指向的對象基本上是在構造函數中創建的,並且一直存在直到包含的類被拋棄。在Foo的構造函數中分配指向另一個對象的指針時,沒有任何代碼可以重新分配,並且我也沒有想到將來會有任何代碼。訪問類內部的私有成員指針的假設

我對使用智能指針的答案不感興趣,因爲我在一些遺留代碼中使用了很多原始指針。移植一切是另一回事,正在計劃中。

我的問題是:

  1. 我可以承擔怎麼樣的指針在類工作中的有效性方面,而?

  2. 如果我有幾個使用該類的私有函數...我應該總是檢查一個nullptr之前在這些函數中解除引用,或者我可以假設指針指向一個有效的對象,給定類的構造方式如果這是本機C++,我會讓指針成爲一個實際的對象,使它消失)?

  3. 任何更好的方法來做到這一點,不涉及創建SomeStructType或智能指針的另一個託管包裝?

    public ref class Foo 
    {   
        private: 
    
        SomeStructType* pMyStruct;   
    
        void Initialize() 
        { 
         pMyStruct = new SomeStructType(); 
        } 
    
        void DoSomethingElse1(); //Uses pMyStruct 
        void DoSomethingElse2(); //Uses pMyStruct 
    
        public: 
    
        void DoSomething(); //Uses pMyStruct or calls private func that does 
    
        Foo() 
        { 
         Initialize(); 
        } 
    
        ~Foo() 
        { 
         delete pMyStruct; 
        } 
    } 
    
+0

推薦重新說明「在指針被重新分配而沒有另一個包含類實例被創建的情況下,不應該有任何實例」,因爲我可以閱讀這三種不同的方式,可能它們都是錯誤的。 – user4581301

+0

我不知道我託管的C++擴展,但在Plain Jane C++中,您的示例將快速違反[Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-的三)。 – user4581301

+0

@ user4581301 1.我同意「三個規則」的評論。我還沒有那麼遠(我將如何重構課程),但是2.我重新措辭了這句話。真的,我只是說指針在構造函數中被賦值並在析構函數中被刪除。除了訪問它指向的對象之外,沒有別的計劃。 – user2079828

回答

0

不,你不需要每次都檢查它,因爲合同(和C++的規則)意味着將永遠在任何時候存在的對象,您可以嘗試訪問它在一個有效的方式。

如果可以重新分配,並且您處於多線程環境中,則可能需要鎖定對其的訪問權限。那將是我能想到的唯一問題。

+0

你能解釋一下「C++規則」的含義嗎?我假設你的意思是,因爲指針指向一個對於該類一生中存在的對象,我不需要擔心它?不需要鎖,因爲這隻會用在一個線程中。 – user2079828