2016-04-26 82 views
-7

有人可以請解釋這裏發生了什麼嗎?這個構造函數是關於什麼的?什麼是RetType?虛擬是什麼意思?我感到很困惑。請如果有可能有一些在線聊天幫助你,我會更高興。有問題明白這個構造函數做什麼

class Traversal { 
public: 
    virtual ~Traversal(){}; 
public: 
    typedef enum { 
     Stop, Continue, Skip, 
     LastRetType 
    } 
    RetType; 
    virtual RetType pre(PDTAdd & d) { 
     return Continue; 
    } 


}; 
+3

我想你可以通過自己找到答案,只需獲得一本C++初學者的書。 –

+2

我認爲你應該遵循建議,找到一些好書或在線教程,並系統地關注它們。有很多,例如:http://www.cplusplus.com/doc/tutorial/或http://www.penguinprogrammer.co.uk/c-beginners-tutorial/classes/ – Bjoern

回答

2

首先...

typedef enum { 
     Stop, Continue, Skip, 
     LastRetType 
    } 
    RetType; 

...是說的一個好辦法...

enum RetType { 
     Stop, Continue, Skip, 
     LastRetType 
    }; 

.. 。它只是創建一個enum類型,可以採取列出的值(Stop默認爲0,Continue1等..)。

pre功能...

virtual RetType pre(PDTAdd & d) { 
     return Continue; 
    } 

...然後返回這些值的 - 它上面的硬編碼Continue

這是virtual,雖然,這意味着派生類可以編寫自己的功能覆蓋,如果有人有Traversal* pTraversal& r,實際上指的是這樣的一個派生類的實例,這將是最派生類提供覆蓋(如果有),其功能由p->pre(d)r.pre(d)運行。這被稱爲虛擬調度,並且是C++支持運行時多態性的方式,這是面向對象編程的基本功能之一。

你的下一步應該是一本好書或教程。

+0

非常感謝!但傑裏比你更快我很抱歉:( –

+0

@KMass:'Traversal :: Continue'和Continue一樣,只是明確了它的範圍。我無法想象任何需要在'pre'內部使用它,但是你可能會在'Traversal'之外看到一些代碼(即不在'Traversal'的任何成員函數中)使用'Traversal :: Continue',所以編譯器知道在哪裏找到它,標識符「繼續」的其他用法(例如,函數名稱,變量,參數,類型...)不會發生衝突。 –

3

您的示例中沒有構造函數。有:

  • 一個什麼也不做的析構函數。

  • 定義了一個名爲RefType的類型,以便可以定義該類型的變量,而不必在任何地方重複枚舉定義。

  • 返回RefType類型值的函數。

如果你能定義枚舉作爲類型的任何地方,則代碼將與此相同:

class Traversal { 
public: 
    virtual ~Traversal(){}; 
public: 
    virtual enum { Stop, Continue, Skip, LastRetType } pre(PDTAdd & d) { 
     return Continue; 
    } 
}; 

查看函數的返回類型是怎樣一個巨大的枚舉?您的示例給出該類型的名稱RefType,以便您無需在聲明變量的任何地方重複枚舉定義。在任何地方定義枚舉都是一件壞事,因此C++不允許這樣做 - 這就是爲什麼typedef存在的原因。

基本上,因爲你不能在一個return語句直接創建一個新的類型(structclassenum),枚舉被提前定義爲RefType,然後RefType用作返回類型。

RetTypetypedef聲明的一部分,它只是跨越多行。作爲一個單一的線,就成了這個樣子:

typedef enum { Stop, Continue, Skip, LastRetType } RetType; 
+0

非常感謝,但是LastRetType呢? –

+0

@KMass LastRefType是enum中的值之一,連同Continue和Stop和Skip –

+0

@DmitriBudnikov是的。但我沒有解釋得很好。請參閱編輯並告訴我你是否認爲它仍然被嚴重解釋。 –