我有这个代码,我正在尝试理解遵循的约定,.cpp文件中定义的所有方法都在它们之前写了template<class KeyType, class DataType>
。这是什么意思?
示例:
//Constructor
template<class key, class type>
MyOperation<key, type>::MyOperation()
{
//method implementation
}
//A method
template<class key, class type>
MyOperation<key, type>::otherOperation()
{
//method implementation
}
由于
答案 0 :(得分:5)
这已经有了一个很好的答案,但我也会把我扔进游泳池。
C ++允许单独完成程序结构的声明和实现。它源于C / C ++程序员如何相互发布新功能:头文件包含在依赖编译单元中,而不是依赖于编译中存在的元数据的单元(就像使用C#或Java时所期望的那样)。
每个时间你给编译器一个指令,无论它是一个声明(“这个接口会有这个东西”)还是一个实现(“这就是这个接口和这些行为“),你有机会模仿该指令。
您可以选择这样做,而不是要求这样做,这比Java和C#等更现代的语言提供了更多的灵活性。
请考虑以下模板(我生锈了,请稍微解决一些语法问题):
template<typename Junk>
class IGotJunk {
private:
Junk myJunk_;
public:
void SetJunk(Junk const& source);
Junk const& GetJunk() const;
}
所述模板的“典型”实现可能包括以下默认行为:
template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
myJunk_ = source;
}
但是,对于字符串,存在在复制指针后修改字符串的风险,在这种情况下,您可以提供专门的行为来确保字符串本身被复制,而不是指针(再次,它是很久很久了......)
void IGotJunk<char*>::SetJunk(char* const& source)
{
free(myJunk_);
myJunk_ = malloc(strlen(source) + 1);
strcpy(myJunk_, source);
}
然后你可以为GetJunk()做类似的事情。这可能是您必须为您创建的每个工件声明模板参数的原因:因为您可能不希望它们在每种情况下都相同。
答案 1 :(得分:3)
此类是模板类 - 可以按类型进行参数化。要创建此类的实例,您可以编写例如
MyOperation<int, int> myop;
关于C ++模板here的文章很不错。模板是C ++的重要组成部分,但它们需要很长时间才能熟练掌握它们。 C ++标准库的很大一部分使用模板(这通常以其非官方名称STL而为人所知)。例如,vector<T>
是T类型的模板。
答案 2 :(得分:1)
它告诉C ++编译器,该声明之后的内容是模板化的。
更具体地说,它意味着在下面的任何内容中,单词KeyType和DataType是某种类型的占位符名称,这在调用方法时是明显的或指定的。此时,编译器获取模板,根据您使用的任何内容替换方法中的KeyType和DataType,并编译该副本。
在您展示的代码示例中,模板化部分是类,因此方法可能实际上不使用它们 - 但是C ++需要能够将方法的泛型实现与类绑定。使用
答案 3 :(得分:1)
模板是一种通过让您定义类的行为而不实际知道类的操作将处理哪种数据类型来使您的类更抽象的方法。实质上,这就是通用编程。这个术语是考虑模板的有用方法,因为它有助于提醒程序员模板化的类不依赖于它处理的数据类型(或类型)。
在很大程度上,模板化的类更侧重于算法思想,而不是单个数据类型的特定细微差别。模板可以与抽象数据类型结合使用,以允许它们处理任何类型的数据。
例如,您可以创建一个可以处理任何数据类型堆栈的模板化堆栈类,而不必为您希望堆栈运行的每个不同数据类型创建堆栈类。具有可以处理多种不同数据类型的单个类的能力意味着代码更易于维护,并且使类更易于重用。
答案 4 :(得分:0)
这只是意味着在头文件模板类中定义为:
template<class key, class type>
class MyOperation
{
...
};
因此,当您在.cpp
文件中实现方法时,您需要包含模板参数:
template<class key, class type> MyOperation<key, type>::
如:
template<class key, class type> MyOperation<key, type>::otherOperation() { ... }