试图了解模板 Class 的工作原理

trying to understand how Template Class works

我已经尽我所能完成了这项作业,但我很确定其中存在根本性问题。我将期待您对如何让它变得更好的评论。问题定义如下: 两个 classes。 XBoxGameWorldPeace.

模板 class 已调用 Gift。有一种方法叫做 shake()。在 shake() 中,我们将在模板类型 T 的实例上调用 MakeNoise()。只有 XBoxGameMakeNoise() 作为方法。

现在在 main() 中,只要您尝试制作一个“包含 XBoxGame”的“Gift”(看看我在那里做了什么?)您就会知道它是否有效当你编译。尝试 Gift<WorldPeace> 但它不会编译,因为缺少 MakeNoise()。您提交的内容应该只有正确模板化的 XBoxGame class 调用 shake() 和编译的 WorldPeace(),但这只是因为它未在 main() 中使用.

最终结果"You can only put a class that makes noise in a gift"。 我写的代码:

#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) 在 Gift::shake() 中你调用了 XboxGame::makeNoise() 但你定义了 class 上部 B (XBoxGame).

(2) 在 Gift::shake() 你写

void XBoxGame::makeNoise();

这是方法的原型,而不是调用

(3)在Gift::shake()中,如果去掉void(见第2点),下面指令

XBoxGame::makeNoise();

成为makeNoise()staticXBoxGameclass方法的调用;但您将 makeNoise() 定义为非 static 方法。

您可以将 makeNoise() 定义为 static 或者您可以从实际的 XBoxGame 对象调用;像

  T shake()
   {
     XBoxGame xbg;

     xbg.makeNoise();
   }

甚至

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

(4) 您已经(隐含地)将 makeNoise() 定义为 XBoxGameprivate 方法。如果要在 Gift 对象中调用它,则必须将其声明为 public(或将 XBoxGame 定义为 struct,因此隐式声明 makeNoise()public

(5) 您已经在 XBoxGame 中定义了 makeNoise(),作为接收几个(未使用的)int 值的方法,但您调用它时没有参数;你必须纠正这一点;一个解决方案可以通过几个 int 调用它;举个例子

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

(6) 在 main() 中,请遵循说明

Gift <XBoxGame>;
Gift <WorldPeace>;

什么都没声明;你应该给一对变量起几个名字

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

或在创建几个临时对象时对其进行转换(避免几个 "unused variable" 警告)

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

(7) 如果你想看到 "Is this Working ?" 消息,你必须调用 shake() 方法

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

(8) 您的 shake 方法被声明为 returning T 但 return 什么都没有;这是一个你可以解决的问题,例如,将其定义为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();
 }

希望这对您有所帮助。

-- 编辑 --

(9) 不确定但是,如果你只想 Gift<XBoxGame> 编译(因为只有 XBoxGame 实现 makeNoise(),我想你应该写 shake()使用 T 类型;所以类似于

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

如果makeNoise()XBoxGame

中的普通方法
  void shake()
   { T::makeNoise(0, 0); }

如果 makeNoine() 是一个 static 方法。