簡體   English   中英

C ++模板問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM