试图了解模板 Class 的工作原理
trying to understand how Template Class works
我已经尽我所能完成了这项作业,但我很确定其中存在根本性问题。我将期待您对如何让它变得更好的评论。问题定义如下:
两个 classes。 XBoxGame
和 WorldPeace
.
模板 class 已调用 Gift
。有一种方法叫做 shake()
。在 shake()
中,我们将在模板类型 T
的实例上调用 MakeNoise()
。只有 XBoxGame
有 MakeNoise()
作为方法。
现在在 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()
static
中XBoxGame
class
方法的调用;但您将 makeNoise()
定义为非 static
方法。
您可以将 makeNoise()
定义为 static
或者您可以从实际的 XBoxGame
对象调用;像
T shake()
{
XBoxGame xbg;
xbg.makeNoise();
}
甚至
T shake()
{ XBoxGame().makeNoise(); }
(4) 您已经(隐含地)将 makeNoise()
定义为 XBoxGame
的 private
方法。如果要在 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
方法。
我已经尽我所能完成了这项作业,但我很确定其中存在根本性问题。我将期待您对如何让它变得更好的评论。问题定义如下:
两个 classes。 XBoxGame
和 WorldPeace
.
模板 class 已调用 Gift
。有一种方法叫做 shake()
。在 shake()
中,我们将在模板类型 T
的实例上调用 MakeNoise()
。只有 XBoxGame
有 MakeNoise()
作为方法。
现在在 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()
static
中XBoxGame
class
方法的调用;但您将 makeNoise()
定义为非 static
方法。
您可以将 makeNoise()
定义为 static
或者您可以从实际的 XBoxGame
对象调用;像
T shake()
{
XBoxGame xbg;
xbg.makeNoise();
}
甚至
T shake()
{ XBoxGame().makeNoise(); }
(4) 您已经(隐含地)将 makeNoise()
定义为 XBoxGame
的 private
方法。如果要在 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
方法。