【问题标题】:trying to understand how Template Class works试图了解模板类是如何工作的
【发布时间】:2017-02-13 21:05:15
【问题描述】:

我已经尽我所能完成了这项任务,但我很确定存在根本问题。我会期待你的 cmets 如何让它变得更好。问题定义如下: 两班。 XBoxGameWorldPeace

名为Gift 的模板类。有一种称为shake() 的方法。在shake() 中,我们将在模板类型T 的实例上调用MakeNoise()。只有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;
}

【问题讨论】:

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


    【解决方案1】:

    我发现你的代码有一些问题。

    排名不分先后……

    (1) 在Gift::shake() 中,您调用XboxGame::makeNoise(),但您使用大写B (XBoxGame) 定义了类。

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

    void XBoxGame::makeNoise();
    

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

    (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() 定义为privateXBoxGame 方法。如果要在Gift 对象中调用它,则必须将其声明为public(或将XBoxGame 定义为struct,因此将makeNoise() 隐式声明为public

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

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

    (6) 在main() 中,按照说明进行

    Gift <XBoxGame>;
    Gift <WorldPeace>;
    

    什么都不声明;你应该给几个变量取几个名字

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

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

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

    (7) 如果您想查看“这是否有效?”消息,您必须调用shake() 方法

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

    (8) 你的shake 方法被声明为返回T 但什么也不返回;这是一个您可以解决的问题,例如,将其定义为 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&lt;XBoxGame&gt;(因为只有 XBoxGame 实现 makeNoise(),我想您应该使用 T 类型编写 shake();所以类似

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

    如果makeNoise()XBoxGame中的普通方法或者

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

    如果makeNoine()static 方法。

    【讨论】:

    • 非常感谢 max66。你完美地解释了一切,我理解我所有的问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多