2017-02-13 31 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