2014-01-29 22 views
-1

我想知道是否使用某個接口的引用而不是指針可能會導致我忽略的一些複雜性。我想這樣做的原因是爲了明確哪些對象應該在構造時「刪除」給予它們的指針,哪些對象應該使用它,而不用擔心其他對象的生命週期以允許多個實例共享一個對象。 (shared_ptr的是不是一個選項)在C++中使用父引用

下面是一個例子:

class Parent 
{ 
public: 
    virtual void WhoAmI() { printf("Parent\n"); } 
}; 
class Child : public Parent 
{ 
public: 
    void WhoAmI() { printf("Child\n"); } 
}; 

class ParentUser 
{ 
public: 
    ParentUser(Parent& parent) : _parent(parent) {} 
public: 
    Parent& _parent; 
}; 

class ParentOwner 
{ 
public: 
    ParentOwner(Parent* pParent): _pParent(pParent), _parentUser(*pParent) {} 
    ~ParentOwner() { delete _pParent; } 
public: 
    Parent*  _pParent; 
    ParentUser _parentUser; 
}; 


int main() 
{ 
    Parent* pParent = new Child(); 
    ParentOwner parentOwner(pParent); 
    parentOwner._parentUser._parent.WhoAmI(); 

    char stopper; 
    cin >> stopper; 
    return 0; 
} 

這工作正常,並預期輸出:「兒童」

回答

0

您使用引用來指示使用對象和指示所有權的指針是非常好的。您只需定義您自己的所有權慣例,並且只要您的所有代碼遵循該慣例,所有內容都應該可以工作。請注意,您的系統中只能有一個對象具有指向要刪除的對象的指針。

在您的示例中,Child對象可以作爲構造函數參數傳遞給一個ParentOwner對象。

0

普遍認爲分配的內存應該是對象負責釋放它。
刪除其他對象可能會導致麻煩。

想象一下這樣的情景:

  1. 對象A創建 「目標文件」。
  2. 對象A將其傳遞給對象B
  3. 對象B將其刪除。
  4. 不知道「Obj」的對象A現在被傳遞給對象C.
  5. 對象C嘗試使用「Obj」。繁榮!