2013-02-14 58 views
0

我只想確定我是否理解指針的屬性。所以,如果我有這樣的事情:驗證我對指針的理解

#include <iostream> 
using namespace std; 

class Person 
{ 
public: 
    Person(){myBook = new Book(4);} 
    void printPerson() 
    { 
    int i =0; 
    while(i<n) 
    { 
     cout<<myBook[i].n<<endl; 
     i++; 
    } 
    } 

private: 
    Book *myBook; 
    int n; 
}; 

class Book 
{ 
public: 
    Book(int num) 
    { 
     int n =0; 
    } 
    int n; 
    }; 

由於Person類的實例是一個指針,當我試圖做一個拷貝構造函數和賦值運算符=,我分配一個新的書新Person對象。我對嗎? THX

+0

你的Person實例在哪裏?你的主要內容是什麼? – alestanis 2013-02-14 22:12:27

+1

你期待'while'循環做什麼?你在期待什麼? – 2013-02-14 22:13:44

+1

在大多數情況下,是的。我不會作出一攬子聲明,說它必須這樣做。根據實現情況,您可能希望Person的多個實例具有指向Book相同實例的指針。 – 2013-02-14 22:13:47

回答

1

(假設下,你的意思是本書的實例,而不是人)

爲了讓一個人的深層副本,你需要創建一個新的Book實例爲好。 使用深層複製功能可以在保留副本和複製的書籍的同時銷燬原始人員及其書籍。

有一些使用案例,您實際上希望兩個人都指向相同的書籍對象。

在這種情況下,您需要跟蹤使用諸如共享指針之類的東西的指針數量。

編輯把它清除掉: 如果你有一個以上的人用同樣的書,你對人有效的析構函數:

class Person { 
public: 
    ~Person() { 
    delete m_pbook; 
    } 
protected: 
    Book *m_pbook; 
} 

class Book { 
    int foo; 
} 

Person a = new Person(); // book pointer is something like 0x12345678 
Person b = new Person(a); // book pointer is identical 0x12345678 

// delete a yields 
delete a; // memory in 0x12345678 is freed up 
b->book; // AccessViolation/Segmentation Fault, the memory in 0x12345678 does not belong to your program any more. 
+0

如果人的多個實例有一個指向Book的同一個實例的指針,那麼什麼時候人obj被破壞?例如,當人a,b,c指向書x時。當人a遭到破壞時,書x被破壞。所以,你不覺得人物b和c會指向一個不存在的物體嗎? – 2013-02-14 22:20:24

+1

@RudiAksam不,你的假設是不正確的。當一個人被解構時,這本書不會被自動破壞。你必須告訴編譯器在Person析構函數中要做什麼。您可以刪除該書,減少引用計數,也可以通過shared_ptr保存該書。 – 2013-02-14 22:22:08

+0

你忘了做'a'和'b'指針。 – 0x499602D2 2013-02-14 22:58:04

4

這裏有一個錯誤:

Person(){myBook = new Book(4);} 

分配一個Book對象與num=4,如果你的意思是分配4個Book元素,這樣做:

Person(){myBook = new Book[4];} 

否則,當你在while循環是不確定的行爲訪問myBook[i]

while(i<n) 
{ 
    cout<<myBook[i].n<<endl; 
       ^^^ ouch 
    i++; 
} 

由於Person類的實例是一個指針,當我試圖做一個拷貝構造函數和賦值運算符=,我不得不分配新的Person對象的新書。我對嗎?

是的,請務必遵循rule of three

其他的建議是,使用std::vector而不是動態數組,使用智能指針來代替,如果你能生指針。