2012-03-02 83 views
0

對於那些經驗豐富的C++編程人員來說,這可能看起來像一個愚蠢的問題,但我認爲一旦你有一個類並且創建了該類的一個對象,就可以使用你創建的對象調用該類的公共方法(除非它是一種靜態方法,在這種情況下,您可以使用對象或類名稱本身來調用它)?不使用對象調用類方法?

那麼爲什麼這個工作?

函數定義:

template <typename Object> 
void printList(const List<Object>& theList) { 
    if (theList.isEmpty()) 
     cout << "Empty list!" << endl; 
    else { 
     ListItr<Object> itr = theList.first(); 
     for(; !itr.isPastEnd(); itr.advance()) 
      cout << itr.retrieve() << " "; 
    } 

    cout << endl; 
} 

函數調用:

printList(myList); 

缺少什麼我在這裏?除非我使用List<int>的對象調用printList(),否則程序的其餘部分如何知道printList()屬於List<int>類?

順便說一句,我剛剛查過。我會用這種方式調用和定義函數。請注意,這次函數是使用this指針定義的,這是我認爲它可行的方式。

函數定義:

template <typename Object> 
void List<Object>::printList() { 
    if(this->isEmpty()) 
     cout << "Empty list!" << endl; 
    else { 
     ListItr<Object> itr = this->first(); 
     for(; !itr.isPastEnd(); itr.advance()) 
      cout << itr.retrieve() << " "; 
    } 

    cout << endl; 
} 

函數調用:

myList.printList(); 
+1

'程序的其餘部分如何知道printList()屬於班級列表'是嗎?爲什麼需要'List '作爲參數,然後呢?在我看來,你創建了一個免費函數,而不是一個成員函數...尤其是當你在第二個例子中創建一個成員函數時,你使用'List ::'顯示你正在執行這些函數類定義之外的定義。 – 2012-03-02 18:55:21

+0

因爲......那是*不是*類中的方法。這是一個簡單的功能。 – 2012-03-02 18:58:31

+0

謝謝 - 我解決了這個問題,並使第一個成員函數;現在它需要能夠被調用的對象。仍然似乎很奇怪,爲什麼它需要的對象也作爲參數傳遞時,可以使用'this'來完成。 – Ambidextrous 2012-03-02 19:02:58

回答

0

你的理解是正確的。除非你沒有告訴我們關於List<>的一些重要內容,或者在本書中丟失了一些重要的教訓,否則第二個例子明顯優於第一個。

那麼爲什麼這個片段需要傳遞對象本身呢?

因爲它是這樣編碼的。說真的,你需要詢問那個代碼的作者,他可能是你書中的作者。

我在這裏錯過了什麼?

這兩個例子並不完全相同。第一個實現「給定兩個List<> s,ab,要求a打印b的內容:a.printList(b)」。給定一個List<>a第二器具」,問a打印本身的內容:。a.printList()

這是可能的,這本書的作者都試圖解釋非常的區別,我不知道他們正在努力展會上,我還沒有看過這本書。

爲什麼不直接使用this

如果你試圖達到的目標2號我上面列出,即允許List打印本身,你應該只使用this

1

考慮在這裏瞎猜,但你需要下列功能是T一個成員函數?因爲它不是。因爲它不是。這只是一個免費功能,需要T


下面是一個類定義和成員函數聲明(儘管成員函數是愚蠢的,因爲它需要一個參數,這可能是完全多餘的):

struct T { 
    void print(const T& someT); 
}; 

而下面的是一樣的傻成員函數定義出來的行:

void T::print(const T& someT) { 
    // ... 
} 

這不是entir從你的問題中清楚地知道你在這裏做了哪一個,但第一個肯定是而不是的一個成員函數。

+0

謝謝 - 修正了這個問題,並且使它成爲了一個成員函數 - 我應該改述我的問題。它現在需要一個對象來完成調用,對我來說,使用'this'的方法似乎也足夠了。 – Ambidextrous 2012-03-02 19:04:45