簡體   English   中英

如何對對象使用指針; 構造函數和析構函數。 C++

[英]How to use pointer with objects; Constructors and Destructors. C++

我正在嘗試按特定順序創建和刪除對象的輸出。 默認情況下,首先使用構造函數析構函數創建第一個對象,依此類推,析構函數從最后創建的對象開始刪除。 我正在嘗試更改類似於此的輸出順序:

Object 1 is created, we've got 1 object(s) now!

Object 2 is created, we've got 2 object(s) now!

Object 3 is created, we've got 3 object(s) now!

Object 3 is deleted, we've got 2 object(s) now!

Object 2 is deleted, we've got 1 object(s) now!

Object 4 is created, we've got 2 object(s) now!

Object 4 is deleted, we've got 1 object(s) now!

Object 1 is deleted, we've got 0 object(s) now!  

代碼:

class Object {
public:
    Object(int i) {
        id = i;
        count++;
        cout<<"Object "<<id<<" is created, we've got "<<count<<" object(s) now!"<<endl;
    }
    ~Object() {
        count--;
        cout<<"Object "<<id<<" is deleted, we've got "<<count<<" object(s) now!"<<endl;
    }
private: 
    int id;
    static int count;
};  

為了做到這一點,我發現我可以使用指針,指向創建的對象並在需要時刪除它,這樣我們就可以控制創建和刪除的順序。

#include"Object.h"
extern void TestObjects()
    {

    Object *a;
    Object obj1(1),obj2(2),obj3(3);

    a = &obj3;
    delete a;

    Object *c;
    c = &obj2;
    delete c;

    }

到目前為止,它只創建了 3 個對象,並在創建后立即刪除了第三個對象,我試圖在刪除第三個對象后立即刪除第二個對象。

您使用delete無效,導致未定義行為,因為您沒有使用new創建對象。 您正在嘗試銷毀堆棧中存在的對象,並且當它們超出范圍時會自動銷毀,您無權手動銷毀它們。

如果你想使用delete來控制銷毀順序,你必須使用new ,像這樣:

void TestObjects()
{
    Object *obj1 = new Object(1);
    Object *obj2 = new Object(2);
    Object *obj3 = new Object(3);

    delete obj3;
    delete obj2;

    Object *obj4 = new Object(4);
    delete obj4;

    delete obj1;
}

現場演示

或者,在您的特定示例中,只需更多地控制對象的范圍並且根本不使用newdelete ,就可以獲得相同的輸出:

void TestObjects()
{
    Object obj1(1);

    {
    Object obj2(2);
    Object obj3(3);
    } // <-- obj3 and obj2 are destroyed here, in that order!

    Object obj4(4);
} // <-- obj4 and obj1 are destroyed here, in that order!

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM