//Version 1
template <typename T>
class Node<T> {
private:
T data;
Node *next;
public:
Node(T data) {
this->data = data;
this->next = NULL;
}
};
//Version 2
template <typename T>
class Node {
private:
T data;
Node *next;
public:
Node(T);
};
template <typename T>
Node<T>::Node(T val) {
data = val;
next = NULL;
}我搞不懂使用版本1创建类与使用版本2创建类有什么不同,版本1还是版本2是首选方法?
发布于 2015-05-06 03:29:27
首先,第二个根本不能编译。正确的语法是
template <typename T>
Node<T>::Node(T val) { // note the <T> part但除此之外,从编译器的角度来看,这是没有区别的。
然而,从程序员的角度来看,这是不同的。通过实现来污染类声明通常被认为是错误的。另一个想要使用你的代码的程序员(甚至是你自己,当你转移到项目的另一部分时)应该能够理解你的代码做了什么,而不需要查看实现,因此你不应该用实现细节来污染类声明。
更好的做法是将代码分离到一个单独的.cpp文件中,并将该.cpp文件#include到一个头文件中(后者是模板化类的必要条件,除非您使用显式实例化)。(有时会使用.cpp以外的扩展名,例如.tpp,用于此目的,但无论如何,文件都应该包含在头文件中。)
另一个注意事项是,您应该坚持使用构造函数中的成员初始化列表:
template <typename T>
Node::Node(T val): data(val), next(NULL)
{}发布于 2015-05-06 03:18:28
我会使用版本1,但没有显式的this指针和成员初始化器:
//Version 1'
template <typename T>
class Node {
private:
T data;
Node *next;
public:
Node(T _data) : data(_data), next(0) { }
};对于版本2,通常在实现文件中使用带有"::“的名称空间访问(.cc .cpp ...)而不是在标头afaik中
发布于 2015-05-06 03:59:22
在形式上,在第一个版本中构造函数是内联的,在第二个版本中则不是。然而,对于模板和现代优化编译器来说,这种差异是无关紧要的:因为它是一个模板,所以无论如何定义都必须在同一个文件中,优化器可能会忽略优化提示,因为它可以自己确定函数何时值得内联(对于这样一个简单的函数,它总是如此)。
https://stackoverflow.com/questions/30061355
复制相似问题