2

つまり、さまざまなデバイス (実際にはカメラ) からのデータを表すために作成した複数のクラスがあります。どちらも内部では異なる動作をしますが、相互作用は外部からはまったく同じになるように構築されています。相互作用が同じである限り、いずれかのクラス、またはおそらくそれ以上のクラスで動作するユーティリティ関数を作成しようとしています。私は C++ にかなり慣れていないので、用語が正しくない場合はご容赦ください。

したがって、カメラごとにこれらの定義があるとしましょう。

class CamDataA
{
int getImageStart() {return ptrToStart;)
    int getImageSize() {return imageSizeVariable;)
}; 

class CamDataB
{
int getImageStart() {return ptrToStart;)
    int getImageSize() {return width*height*channels;)
}; 

そして、どちらのクラスとも互換的に機能する別の別のクラスが必要です

class imageUtils
{
    //constructors/destructors

    int reportSize( void* camData)
    {
        cout << camData->getImageSize();
    }

}; 

しかし、コンパイル時に発生するエラーは次のとおりです。

error: ‘void*’ is not a pointer-to-object type

これは可能ですか?

4

2 に答える 2

5

void *型なしポインタです。ポインターを介してオブジェクトのメソッドを呼び出すには、ポインターが適切な型である必要があります。または、それが指しているオブジェクトがわかっている場合は、明示的にキャストできますvoid *が、それは必要ではありません (オブジェクトのタイプを事前に知りません)。CamDataA*CamDataB*

あなたの場合、仮想メソッドを使用すると便利です。

1)インターフェイスを定義します。つまり、実装なしで一連のメソッドを定義します。

class CamDataBase {
  public:
    virtual int getImageStart() = 0;  // "=0" means abstract methods - MUST be 
    virtual int getImageSize() = 0;   // overriden in descendants
};

キーワードは、メソッドが子孫クラスでオーバーライドvirtualできることを意味します。これは、たとえば というポインタがあり、そのポインタが のような子孫クラスを指している場合、 と書くと、ではなく、実際の (現在の) オブジェクトの型 ( ) に対応するメソッドが呼び出されることを意味します。へのポインタです。CamDataBase* pp = new CamDataA()p->getImageStart()CamDataA::getImageStart()CamDataBase::getImageStart()pCamDataBase

2) 次に、インターフェースの実装をいくつか定義します。親クラスの仮想メソッドと同じシグネチャを持つメソッドは、それらをオーバーライドします。

class CamDataA: public CamDataBase {
  int getImageStart() {return ptrToStart;)
  int getImageSize() {return imageSizeVariable;)
}; 
class CamDataB: public CamDataBase {
  int getImageStart() {return ptrToStart;)
  int getImageSize() {return width*height*channels;)
}; 

CamDataBase3) 次に、ポインターまたはその子孫のいずれかを受け取る関数を定義します。

void reportSize(CamDataBase* camData) // using the base class
{
   // type of the object and the appropriate method 
   // are determined at run-time because getImageSize() is virtual
   std::cout << camData->getImageSize();
}

そして、ここにいくつかの例があります:

CamDataA A;
CamDataB B;
reportSize(&A); // CamDataA::getImageSize() is called
reportSize(&B); // CamDataB::getImageSize() is called

CamDataBase *p = &A;
reportSize(p); // CamDataA::getImageSize() is called

// and even if we cast pointer to CamDataA* to a pointer to CamDataB*:
reportSize((CamDataB*)&A); // CamDataA::getImageSize() is called

Web で新しい単語を検索してみてください。:)

于 2013-05-22T20:36:53.187 に答える