试图了解Template Class的工作原理

时间:2017-02-13 21:05:16

标签: c++ templates visual-c++ template-classes

我完成了这项任务,因为我理解它,但我很确定存在根本问题。我期待着您对如何改进它的意见。问题定义如下: 两节课。 XBoxGameWorldPeace

名为Gift的模板类。有一种叫做shake()的方法。在shake()内,我们将在模板类型MakeNoise()的实例上调用T。仅XBoxGame MakeNoise()作为方法。

现在在main(),只要您尝试制作一个“Gift持有XBoxGame”(看看我在那里做了什么?),你会知道它是否有效编译。尝试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;
}

1 个答案:

答案 0 :(得分:0)

我在你的代码中看到了一些问题。

没有特别的顺序......

(1)在Gift::shake() XboxGame::makeNoise()中,您拨打了B,但是您定义的班级为XBoxGame Gift::shake()

(2)在你写的void XBoxGame::makeNoise();

Gift::shake()

这是方法的原型,而不是通话

(3)在void中,如果删除XBoxGame::makeNoise(); (请参阅第2点),则执行以下说明

makeNoise()

成为static XBoxGame中对class makeNoise() 方法的调用;但是您将static定义为非makeNoise()方法。

您可以将static定义为XBoxGame,也可以从实际的 T shake() { XBoxGame xbg; xbg.makeNoise(); } 对象调用;

之类的东西
  T shake()
   { XBoxGame().makeNoise(); }

甚至

makeNoise()

(4)您(隐式)将private定义为XBoxGame的{​​{1}}方法。如果您想在Gift对象中调用它,则必须将其声明为public(或将XBoxGame定义为struct,因此隐式声明makeNoise()public makeNoise()

(5)你在XBoxGame中定义了int作为接收一些(未使用的)int值的方法,但你没有参数调用它;你必须纠正这一点;一个解决方案可以通过几个 T shake() { XBoxGame().makeNoise(0, 0); } 来调用它;通过例子

main()

(6)在Gift <XBoxGame>; Gift <WorldPeace>; 中,按照说明

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

什么也没有宣布;你应该为一组变量提供一对名字

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

或者在创建一些临时对象时进行转换(避免一对“未使用的变量”警告)

shake()

(7)如果你想看到“这有效吗?”消息,您必须调用Gift<XBoxGame>().shake(); Gift<WorldPeace>().shake(); 方法

T

(8)你的摇动方法被声明为返回void但没有返回;这是一个可以解决的问题,例如,将其定义为 void shake() { XBoxGame().makeNoise(0, 0); } 方法

#include <iostream>   

class XBoxGame
 {
   public:
      void makeNoise(int,int)
       { std::cout << "Is this Working ? " << std::endl; };
 };

class WorldPeace
 {};


template <typename T>
class Gift
 {
   public:
      void shake()
       { XBoxGame().makeNoise(0, 0); }
 };

int main()
 {
   Gift<XBoxGame>().shake();
   Gift<WorldPeace>().shake();
 }

因此,以下代码编译

Gift<XBoxGame>

希望这有帮助。

- 编辑 -

(9)不确定理解,但是,如果你只想XBoxGame编译(因为只有makeNoise()实现shake(),我想你应该用T来编写 void shake() { T().makeNoise(0, 0); } makeNoise()类型;类似

XBoxGame

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

中的普通方法
static

如果<div style="height: 100%" id="map"></div> standardNum = 50 def numberChecker(number, standardNum): if number > standardNum: raise ValueError return True while True: my_number = int(input("Give me a small whole number: ")) try: if numberChecker(my_number, standardNum): break except ValueError: print("Your number is too big.") 方法。