[英]C++ templates question
template <class T>
class ListNode {
public:
T* data;
ListNode<T>* next;
}
可以說我有一個列表節點模板,並且在代碼中的某個地方我想要獲取數據的副本-意味着不是指向數據的指針(T *)的副本,而是指向另一個指針的新指針(T *)。放置在具有相同信息的內存中。
使用C ++模板時該怎么辦? 如果我不知道T是什么類型,該如何復制(* data)。
編譯器知道T的類型。 不知道是指向T的多少個實例。 就獲得實際的實現而言,簡短的答案是不使用指針類型。 請改用容器。 由於無論如何都要復制節點數據,因此開銷很小。 下面的顯式示例:
template <class T>
class ListNode {
public:
// use a vector as the container
std::vector<T> data;
ListNode<T>* next;
// initializer from pointer primitive
ListNode(const T* ps,size_t elements)
{
data.assign(ps,ps+elements);
}
// copy templated instance
ListNode(const ListNode& arg)
{
data = arg.data;
}
// assignment
ListNode& operator=(const ListNode& arg)
{
if (this != &arg)
{
data = arg.data;
}
return *this;
}
};
實際用法與此類似:
{
const char* ps = "Hello World";
ListNode<char> ln1(ps,strlen(ps));
ListNode<char> ln2 = ln1;
}
當然,您可以獲得更復雜的解決方案,但是它們都涉及跟蹤指針指向的T類型實例的數量。
T必須是可復制構造的,以便您可以執行
template <class T>
ListNode<T>::ListNode(const ListNode<T>& src)
{
...
// given a preexisting copy, src, create a new T to
// perform a copy
T* destT = new T(*srcT);
}
如果T具有復制構造函數,則它將起作用。 如果不是這樣,編譯器會給您一個錯誤(可能是一個非常隱秘的錯誤)
使用operator =或復制構造函數。 按照慣例,這兩種方法都會產生對象的副本。
因此,例如:
T *p = other_pointer;
*p = *data;
要么
T* copy = new T(*data);
創建模板化類型的副本時,實際上,您不必擔心這種類型,並在該類型的副本構造函數或賦值運算符上執行該任務:
template <class T>
class ListNode {
public:
T* data;
ListNode<T>* next;
T* getCopy() { new T(*data); } // get copy of "data"
};
假設您對class A
使用此ListNode<T>
,則可以為A定義一個副本構造函數(以及賦值運算符):
class A {
public:
A(const A& copy);
};
現在,當ListNode<T>::getCopy()
被調用時,它將在內部調用A的副本構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.