2017-02-13 79 views
0

我已經完成了這個任務,盡我所知,但我確信存在根本性問題。我會期待您對如何使它變得更好的意見。問題定義如下: 兩個類。 XBoxGameWorldPeace。模板類Gift。有一種方法稱爲shake()。在shake()內部,我們打電話MakeNoise()對我們的模板類型T的一個實例。只有XBoxGameMakeNoise()作爲一種方法。試圖瞭解模板類如何工作

現在在main()當您嘗試製作一個包含XBoxGame的「Gift」(請參閱​​我在此處做了什麼?)後,您會知道它在編譯時是否有效。嘗試Gift<WorldPeace>,它不會編譯,因爲缺少MakeNoise()。你輸入的內容應該只有正確模板化的XBoxGame類調​​用shake()WorldPeace()編譯,但只是因爲它沒有在main()中使用。

最終結果「你只能放一個讓禮物變成噪音的班級」。 代碼中,我寫道:

#include <iostream> 
    class XBoxGame 
    { 
     void makeNoise(int,int) 
    { 
     std::cout << "Is this Working ? "; 
    }; 
    }; 

class WorldPeace 
{}; 


    template <typename T> 
    class Gift 
    { 
    public: 
     T shake() 
    { 
     void XboxGame::makeNoise(); 
    } 
    }; 

本公司主營:

#include "Template.h" 
using namespace std; 
int main() 
{ 
Gift <XBoxGame> ; 
Gift <WorldPeace>; 

return 0; 
} 

回答

0

我看到你的代碼中的一些問題。

沒有特定的順序...

(1)Gift::shake()你叫XboxGame::makeNoise()但你有上BXBoxGame)中定義的類。

(2)Gift::shake()你寫

void XBoxGame::makeNoise(); 

這是一個prototipe一種方法,而不是一個呼叫

(3)Gift::shake(),如果刪除void(見點2),則下面的指令

XBoxGame::makeNoise(); 

成爲呼叫到makeNoise()static方法XBoxGameclass;但是您將makeNoise()定義爲不是static方法。

您可以將makeNoise()定義爲static,或者您可以從實際的XBoxGame對象調用;像

T shake() 
    { 
    XBoxGame xbg; 

    xbg.makeNoise(); 
    } 

甚至

T shake() 
    { XBoxGame().makeNoise(); } 

(4)你(隱含的)定義makeNoise()XBoxGame一個private方法。如果你想叫它在Gift對象,你必須將其聲明爲public(或定義XBoxGamestruct,所以隱式聲明makeNoise()public

(5)你定義makeNoise(),在XBoxGame,作爲方法接收一對夫婦(未使用)int類型的,但你怎麼稱呼它不帶參數,你必須糾正這一點,一個解決方案,可以通過幾個int在叫它;例如

T shake() 
    { XBoxGame().makeNoise(0, 0); } 

(6) main(),閱讀說明

Gift <XBoxGame>; 
Gift <WorldPeace>; 

沒有聲明;你應該給夫妻的名字爲變量

Gift<XBoxGame> gx; 
Gift<WorldPeace> gv; 

一個cuoples或在創建幾個臨時對象(避免夫妻「未使用變量」的警告)

Gift<XBoxGame>(); 
Gift<WorldPeace>(); 

的改變這個( 7)如果你想看到「這工作嗎?」郵件,您必須將shake()方法

調用
Gift<XBoxGame>().shake(); 
Gift<WorldPeace>().shake(); 

(8)你搖方法聲明爲返回T但什麼都不返回;這是可以解決的,通過實例的問題,將其定義爲一個void方法

void shake() 
    { XBoxGame().makeNoise(0, 0); } 

所以,下面的代碼編譯

​​

希望這有助於。

- 編輯 -

(9)不知道,瞭解,但是,如果你想只Gift<XBoxGame>編譯(因爲只有XBoxGame實施makeNoise(),我想你應該使用T型寫shake(),所以像

void shake() 
    { T().makeNoise(0, 0); } 

如果makeNoise()XBoxGame還是普通的方法

void shake() 
    { T::makeNoise(0, 0); } 

如果makeNoine()static方法。

+0

非常感謝你max66。你完美地解釋了一切,我明白了我所有的問題。謝謝 – ArashDe