C++ 模板<;类键、类类型>;C+中方法前的平均值+;?
我已经得到了这段代码,我正在努力理解遵循的约定,.cpp文件中定义的所有方法都是在它们之前编写的C++ 模板<;类键、类类型>;C+中方法前的平均值+;?,c++,C++,我已经得到了这段代码,我正在努力理解遵循的约定,.cpp文件中定义的所有方法都是在它们之前编写的模板。这是什么意思 例如: //Constructor template<class key, class type> MyOperation<key, type>::MyOperation() { //method implementation } //A method template<class key, class type> MyOperation&
模板
。这是什么意思
例如:
//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
}
//构造函数
模板
MyOperation::MyOperation()
{
//方法实现
}
//方法
模板
MyOperation::otherOperation()
{
//方法实现
}
谢谢这个类是一个模板类——它可以通过类型参数化。要创建该类的实例,您可以编写
MyOperation<int, int> myop;
MyOperation-myop;
关于C++模板有一篇不错的文章。模板是C++的重要组成部分,但要花很长时间才能精通。C++标准库的很大一部分使用模板(这通常是由它的非官方名称,STL)知道的。例如,
vector
是类型为T的模板。它只是意味着在头文件中模板类被定义为:
template<class key, class type>
class MyOperation
{
...
};
例如:
template<class key, class type> MyOperation<key, type>::otherOperation() { ... }
模板MyOperation::otherOperation(){…}
它告诉C++编译器,声明之后的内容是模板化的。
更具体地说,这意味着在接下来的任何情况下,单词KeyType和DataType都是某些类型的占位符名称,在调用该方法时,这些占位符名称将是明显的或指定的。此时,编译器将获取模板,根据您使用的内容替换方法中的KeyType和DataType,并编译该副本
在代码示例中,显示模板的部分是类,所以方法可能实际上不使用它们——但是C++在使用时需要能够将方法的通用实现绑定到类。
< P>已经有一个很好的答案已经存在,但是我也将把我的也投入到池中。
C++允许单独完成程序结构的声明和实现。它源于C/C++程序员如何相互发布新功能:头文件包含在依赖的编译单元中,而不是那些依赖于编译中存在的元数据的单元中(就像使用C#或Java时所期望的那样)
每次给编译器一条指令,无论是声明(“这个接口会有这个东西”)还是实现(“这个接口和这些行为会有这个东西”),您都有机会将该指令模板化
事实上,您可以选择这样做,而不是要求这样做,这比Java和C等更现代的语言提供的灵活性要大得多
考虑以下模板(我已经生锈了,请注意一些小的语法问题):
模板
I类垃圾{
私人:
垃圾我的垃圾;
公众:
无效设置垃圾(垃圾常量和来源);
垃圾常量&GetJunk()常量;
}
所述模板的“典型”实现可能包括以下默认行为:
template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
myJunk_ = source;
}
模板
void IGotJunk::SetJunk(垃圾常量和源)
{
我的垃圾=来源;
}
但是,对于字符串,在复制指针之后,字符串有被修改的风险,在这种情况下,您可以提供一种专门的行为来确保复制字符串本身,而不是指针(同样,这是一个很长很长的时间)
void IGotJunk::SetJunk(char*const&source)
{
免费(我的垃圾);
我的垃圾=malloc(strlen(来源)+1);
strcpy(我的垃圾,来源);
}
然后可以对GetJunk()执行类似的操作。这可能就是为什么您必须为您创建的每个工件声明模板参数的原因:因为您可能不希望它们在每种情况下都相同。其他人给出了很好的答案-我只想指出,在标准库标题的某个地方,您会找到类似的内容,例如std::map::insert-std::map,std::set和std::vector以及其他标准容器都是模板类。
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);
}