0

クラスを「通常の」クラスからテンプレート クラスに変換しようとしていますが、正しい構文がわかりません。以下は、私が始めているものの(非常に単純化された)例です。これは、x64 アーキテクチャ、Windows 7 を対象とした Visual Studio 2010、C++ です。

目標は、クラス T をテンプレートとして書き直して、TEntry または新しいクラス OtherTEntry (概念は TEntry に似ている) のいずれかを処理することであり、メンバー関数は同じですが、データ メンバーは異なります。

これを行う最善の方法についてアドバイスをいただければ幸いです。可能であれば、ヘッダー ファイルと実装ファイルを分けておきたいと思います。私は特に、ローカル変数 T * への参照と、sizeof() を適切に使用する方法にこだわっています。

ファイル内:

class T
{
    T(void);
    T(G *pGIn, const unsigned long s, char nIn);
    ~T(void);

    // Member functions
    public:
    bool Expand(const unsigned long newS);
    void Empty(void);

    private:
    G *pG;
    char n;
    unsigned long s;
    int f;
    TEntry *p;
};

ファイル TEntry.h 内:

class TEntry
{
    // Constructors
    public:
    TEntry();
    TEntry(int l);

    // Member functions
    public:
    void Relocate(int delta);

private:

    // Data members
    int k;
    TEntry *p;
};

ファイル T.cpp:

T::T()
{
    p=NULL; s=0; pG=NULL;
    Empty();
    return;
}

T::T(G *pGIn, const unsigned long m, char nIn)
{
    pG=pG; n=nIn;
    return;
}

T::~T(void)
{
    if(p!=NULL)
        delete[] p;
    return;
}

bool T::Expand(const unsigned long newS)
{
    T *pBefore=p;
    p=(T *)_realloc_dbg(p, newS*sizeof(T), _NORMAL_BLOCK,__FILE__,__LINE__);
    s=newS;
    return p!=NULL;
}

void T::Empty()
{
    f=0;
    return;
}

TEntry.cpp ファイル内:

T::T()
{
}

T::T(int i)
{
    k=i;
}

void T::Relocate(int delta)
{
    k+=delta;
    return;
}
4

3 に答える 3

1

最も簡単な方法は、後でテンプレートで使用するタイプの1つで記述された、完全で機能する非テンプレートバージョンから始めるTことです(ここでの明らかな選択:) TEntry

実用的な実装ができたら、それをテンプレートに変換できます。

  1. テンプレートパラメータの名前を選択します。タイプパラメータの通常の名前はTですが、その名前はすでにプロジェクトで使用されているため、を使用しますU
  2. TEntry内のすべての出現箇所をTテンプレートパラメータの名前に置き換えます(U
  3. テンプレートヘッダーを次のクラス定義に追加しますT

    template <class U>
    class T {
      //...
    
  4. Tクラス定義の外部で定義されている各メンバーにテンプレートヘッダーを追加します。

    template <class U>
    «return type» T<U>::«member specification» //...
    
  5. すべてのテンプレートコードがヘッダーファイルに含まれていることを確認します(直接または#includeディレクティブを介して間接的に。テンプレートでは、ヘッダーとソースの個別のコンパイルはサポートされていません。
于 2013-02-24T08:34:00.450 に答える
0

ヘッダーファイルと実装ファイルを分けておきたい

これを行うことは可能ですが、それは少し悪夢です。通常、テンプレートのすべての部分をまとめておくのが最善です。

おそらく必要なのは次のようなものです。

template< typename TYPE > class T
{
    // ...
    TYPE* p;
};

その後、を使用できますsizeof( TYPE )

実行できないこと、および絶対に実行してはならないことの1つは、reallocをnewおよびdeleteと混合することです。C ++は、newおよびdeleteで割り当てられたメモリの再割り当てをサポートしていません。代わりに、std::vectorメモリを管理するようなコンテナがあります。

そして、すでに述べたように、1文字のクラスと変数の名前は良い考えではありません。:)

于 2013-02-24T08:31:46.393 に答える
0

一般に、テンプレート コードは .h ファイルに保持することをお勧めします。絶対に必要な場合は、実装を .cpp ファイルに入れることができます。詳細については、David Vandevoorde と Nicolai M. Josuttisによる C++ Templates: The Complete Guide の Chaprer 6 を参照してください。

あなたはこのように行くことができます(あまり重要でない詳細を切り捨てます):

template <class T>
class YourClass
{
    YourClass()
       : p(NULL), s(0), pG(NULL)
    {
       Empty();
    }

    YourClass(G *pGIn, const unsigned long s, char nIn)
    {
       // ... implementation here
    }
    ~YourClass()
    {
        if(p!=NULL)
           delete p;
    }


public:
    bool Expand(const unsigned long newS)
    {
        T *pBefore=p;
        p=(T *)_realloc_dbg(p, newS*sizeof(T), _NORMAL_BLOCK,__FILE__,__LINE__);
        s=newS;
        return p!=NULL;
    }


private:
    G *pG;
    char n;
    unsigned long s;
    int f;
    T* p;
};

いくつかのメモ:

  • クラス テンプレートに名前を付けるのは、テンプレート パラメーター名Tに使用する一般的な方法であるため、実際にはお勧めできません。T
  • に関しては、コード例ではテンプレートには適用されませんが、通常のクラスには適用されますが、とにかく、クラス、クラス テンプレート、またはテンプレート パラメーターでsizeof使用しても問題はありません。sizeof
于 2013-02-24T15:53:47.403 に答える