簡體   English   中英

C ++ :. cpp文件中的實例本身的表示關鍵字定義了類的功能

[英]C++: Representation keyword of the instance itself inside a .cpp file defining functions of a class

例如,我創建一個名為Circle的類,並在Circle.h對其進行Circle.h

class Circle {
    public:
        Circle *parent;

        Circle();
};

並在一個單獨Circle.cpp同一個目錄下的文件Circle.h ,我定義構造函數。

Circle::Circle() {
    // creates a root circle, parent is set to itself
    *parent = ????
}

我應該填寫什么???? 部分? 在AS3中,我知道在定義類的函數時可以使用this關鍵字表示實例本身。 在C ++中使用什么?

編輯2012/11/29 23:56

還有另一個構造函數:

Circle(Circle*);

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

一個函數在被調用時會創建一個新的Circle實例,並將新實例的*parent為調用者。

void addChild();

void Circle::addChild() {
    Circle child(????);
}

???? 仍然是那個神秘的部分。 根據我閱讀的資源, this似乎已被棄用或具有其他含義?

您要尋找的關鍵字是this 它是在其上調用該函數的實例的指針。 在您的示例中,您將像這樣使用它:

Circle::Circle()
{
  parent = this;
}

注意它必須是parent = this; 而不是 *parent = this; 后者將分配給parent對象指向的對象,這是無效的( parent具有不確定的值)。 幸運的是,它不會編譯,因為您將向對象分配一個指針。

對於此類情況(在構造函數內部初始化數據成員),C ++具有初始化程序語法,通常比在構造函數主體中分配成員更可取。 代碼如下所示:

Circle::Circle()
  : parent(this)
{}

同樣,在C ++中, this關鍵字是指向當前對象的指針。 由於它是一個指針,因此您應該直接分配給parent指針,而不要取消對其的引用。

parent = this;

但是,您確定要讓圈子的父母成為自己嗎? 通常,層次結構中最頂層的對象具有空的父指針:

parent = nullptr;

或者在不支持nullptr的編譯器中,使用NULL0

由於您沒有初始化parent指針以指向任何有效的Circle對象,因此在取消引用時,代碼將調用未定義的行為。 然后,您試圖類型的對象賦給Circle*到類型的對象Circle ,你的編譯器會抱怨。

根據我閱讀的資源,這似乎已被棄用或具有其他含義?

您正在閱讀不良資源或誤讀它們。 在C ++(03 | 11)中, this指針仍然有效。

向后移動,您的難題的解決方案是使用this

void Circle::addChild() {
    Circle child(this);
}

這段代碼幾乎是正確的:

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

但是不是很正確,因為*parent取消了parent ,這不是您想要的。 你想要做的是指定parent指針,不做出改變的東西parent點:

Circle::Circle(Circle *cParent) {
    parent = cParent;
}

與ctor同時:

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = ????
}

但是,在這種情況下,由於根節點在概念上沒有父節點,因此該節點的parent成員不應指向自身,而不能指向任何節點:

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = NULL; // or '0' or 'nullptr' with C++11
}

暫無
暫無

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

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