IE。我想编写一个可以像这样使用的 ADT 类:
myADT <type> objectA;
就像有人会使用这样的向量:
vector <type> aVector;
我猜它可能与模板和重载 <> 运算符有关,但我如何让它将数据类型作为参数?
假设您有一个使用硬编码 typedef 实现 ADT 的类T
:
class ADT
{
public:
typedef int T;
ADT();
T& operator[](size_t index);
const T& operator[](size_t index) const;
size_t size() const;
...
private:
T* p_;
size_t size_;
};
(您必须制定适合您实际 ADT 的内部存储和成员函数)。
要更改此设置,以便您可以指定T
为已完成std::vector
等:
template <typename T> <-- specification of T moved to here
class ADT
{
public:
<-- typedef for T removed from here
ADT();
T& operator[](size_t index);
const T& operator[](size_t index) const;
size_t size() const;
...
private:
T* p_;
size_t size_;
};
那么用法是:
ADT<int> an_adt_int;
ADT<double> an_adt_double;
如果 ADT 是抽象数据类型,那么您应该使用模板
template<class T>
struct myADT
{
// implementation, for example, two variables of type T.
T A;
T B;
};
使用
myADT<int> objectA;
objectA.A = 3;
objectB.B = 4;
myADT<char> C;
C.A = 'A';
我建议您阅读有关 C++ 模板的书籍或文章。谷歌“C++ 模板”。
我希望这是你正在寻找的
template <typename NodeType> class List;
template <typename NodeType>
class Node_List
{
...
private:
NodeType date;
Node_List< NodeType > *next_Ptr;
}
class List
{
...
private:
Node_List< NodeType > *first_Ptr;
Node_List< NodeType > *last_Ptr;
}
使用:
列表 <int> int_list; 列表 <char> char_list;
模板有助于适应类型的功能,而无需为每种类型实际重复代码,这是通用编程。
template < class T >
class foo
{
T number ;
public:
foo( T a )
{
number = a; // This can be achieved through initializer lists too.
}
};
在上面的代码片段中,关键字template
表示以下是一个模板。并且类型是class
,即,包含在 中<>
。所以,foo
是一个模板参数为的类模板T
。
foo<int> obj(10);
模板参数的类型为int
。因此,相应的代码是由编译器在模板实例化时生成的。IE,
class foo
{
int number ;
public:
foo( int a )
{
number = a; // This can be achieved through initializer lists too.
}
};
如果提供了不同的模板参数int
,则编译器将在模板实例化时生成相应的代码。有关详细信息,请参阅 MSDN 模板教程。希望能帮助到你。
@Matt Munson,托尼的问题有一个答案......来自cplusplus:
使用类型参数声明函数模板的格式是:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
两个原型之间的唯一区别是关键字 class 或关键字 typename 的使用。它的使用是模糊的,因为这两个表达式具有完全相同的含义并且行为方式完全相同。