3

ジェネリック プログラミングと、仮想関数とテンプレートを一緒に使用してはいけない方法に関する記事をいくつか見たことがあります。テンプレートはコンパイル時に決定され、仮想関数は実行時まで選択されないため(単純化されているため)、このイディオムを理解しています。

ただし、OO スタイルと Generic スタイルを一緒に使用するコードが少しあり、希望どおりに動作するようです。

私の質問:

次の設計の悪い習慣です。ポリモーフィズムと汎用コードの混合?

以下の私のコードに落とし穴はありますか?(データ メンバーを継承すべきではないことはわかっていますが、:-/ があります)。

#ifndef BaseTemplate_H
#define BaseTemplate_H

#include <vector>

template< class T >
class BaseTemplate {

 public:

  typedef std::vector<T*> pVT;

  BaseTemplate(){}
  virtual ~BaseTemplate(){};
  virtual void Process()=0;
  const pVT& getContainer(){ return m_pContainer; }

 protected:

  pVT m_pContainer;

 private:

  BaseTemplate( const BaseTemplate& cpy );
  BaseTemplate& operator=( const BaseTemplate& rhs);



};

#endif

継承するときにどのタイプが必要かを基本テンプレートに伝えることで、最初に基本クラスから継承します。これにより、複数の型に対して 2 つの継承が可能になります。これは、設計で分けておきたいものです。

#ifndef DerClassA_H
#define DerClassA_H

#include <iostream>
#include "BaseTemplate.h"

class DerClassA: public BaseTemplate<int> {

 public:

 DerClassA(){}
 virtual ~DerClassA(){}
 virtual void Process(){
   std::cout << "HELLO I AM: DerClassA" << std::endl;
 }//This will push_back objects to m_pContainer

 private:

 DerClassA( const DerClassA& cpy );
 DerClassA& operator=( const DerClassA& rhs);



};

#endif


#ifndef DerClassB_H
#define DerClassB_H

#include <iostream>
#include "DerClassA.h"

class DerClassB: public DerClassA {

 public:

 DerClassB(){}
 virtual ~DerClassB(){}
 virtual void Process(){
   std::cout << "HELLO I AM: DerClassB" << std::endl;
 }//This will push_back objects to m_pContainer

 private:

  DerClassB( const DerClassB& cpy );
  DerClassB& operator=( const DerClassB& rhs);



};

#endif

#include "DerClassA.h"
#include "DerClassB.h"

int main()
{

  BaseTemplate<int> *pClassA = new DerClassA();
  pClassA->Process();

  DerClassA *pClassB = new DerClassB();
  pClassB->Process();

  delete pClassA;
  delete pClassB;

  return 0;
}
4

1 に答える 1

4

次の設計の悪い習慣です。ポリモーフィズムと汎用コードの混合?

いいえ、それが正しいこともあります。

以下の私のコードに落とし穴はありますか?

  • 生のポインターを含むコンテナーstd::vector<T*> pVT;は、少し怪しいように見えます。
  • 基本クラスのデストラクタは、おそらく純粋仮想でなければなりません。
  • クラスをコピー不可にするために C++11 構文を使用します。
  • 基本クラスをコピー不可にするだけです。
  • メイン関数で動的割り当てが必要だとは思いません。

残りについては、すぐにエラーは表示されません。

何をしようとしているのかを知らずに、あなたのデザインが良いかどうかは言えません。

于 2012-07-03T10:10:09.190 に答える