2

c ++(openCVを使用)では、ヘッダーファイルで呼び出しを次のように定義しました。

class myClass
{
public: 
    myClass ( cv::Mat& _mat );
    void initClass ( cv::Mat& img, cv::Mat& mask, myClass& src, myClass& dst );
}

次に、対応する「cpp」ファイルで、次のように定義しました。

myClass::myClass ( cv::Mat& _mat )
{
    model = _model;
     ....
 }

void myClass::initClass ( cv::Mat& img, cv::Mat& mask, myClass& src, myClass& dst )
{
    //some work here
}

次に、そのヘッダーファイルを「main.cpp」にインクルードし、次のように呼び出しようとしました。

cv::Mat test ( height, width, CV_8UC3 );
cv::Mat test2 ( height, width, CV_8UC3 );
myClass::myClass auM ( test );
myClass::myClass buM ( test );
myClass::initClass ( img, img, auM, buM );

しかし、最後の2行の両方でエラーが発生し、次のようになります。

オーバーロードされた関数「myClass::myClass」のどのインスタンスが意図されているかを判別できません

ラインのために

myClass::myClass auM ( test );
myClass::myClass buM ( test );

非静的メンバー参照は、特定のオブジェクトに関連している必要があります

ラインのために

    myClass::initClass ( img, img, auM, buM );

検索して、クラス定義に関連するものであることがわかりましたが、解決できませんでした。誰かが私を助けてもらえますか?

4

3 に答える 3

2

1つのコンストラクター引数を取るクラスをインスタンス化するための構文は次のとおりです。

myClass auM(test);

「呼び出す」必要はありませんmyClass::myClass。menber関数についてinitClassは、静的メソッドであるかのように呼び出しています。非静的メンバー関数は、インスタンスで呼び出す必要があります。

auM.someMethod( arg1, arg2, .... );
于 2012-10-19T17:51:02.633 に答える
2

myClassの2つのオブジェクト、auMとbuMを作成しようとしているだけの場合は、次のことを行う必要があります。

myClass auM ( test );
myClass buM ( test );
于 2012-10-19T17:51:18.517 に答える
1

たとえば、このチュートリアルのように、C++でのオブジェクト指向プログラミングに関するチュートリアルをもう一度見る必要があると思います。juanchopanzaが述べたように、あなたの特定の問題は静的メンバーと非静的メンバーの違いに基づいています。これに関する情報は、チュートリアルページ「クラス(II)」にあります。

つまり、非静的メンバー(最も一般的に使用されるタイプ)は、クラスのオブジェクト(インスタンス)に属します。これは、変数にアクセスしたり関数を呼び出したりする前に、クラスをインスタンス化する必要があることを意味します。このような:

MyClass myObject();
myObject.nonStaticMemberFunction();

一方、静的メンバーはクラスに属し、このクラスの特定のオブジェクトには属していません。クラスの名前にアクセスすることで呼び出すことができます。そのように:

MyClass::staticMemberFunction();

これは、これらのさまざまなタイプの関数を呼び出す方法の大まかな概要です。チュートリアルを見て、実際に違いを理解してください。

私があなたのコードで変更することがいくつかあります、私はあなたが達成しようとしていることを常に得るとは限りませんが、これが私がそれをする方法です:

// Never heard of a "call" keyword, must be a #define?!
// By convention most people use upper case class names, to
// distinguish classes from objects.
class MyClass 
{
public: 
    MyClass ( cv::Mat& _mat );
    // If your convention is to use underscores to mark function parameters,
    // you should stick to it.
    void initClass ( cv::Mat& _img, cv::Mat& _mask, myClass& _src, myClass& _dst );
}

MyClass::MyClass ( cv::Mat& _mat )
{
    // I don't know where these variables come from, but again:
    // if you use underscores, to mark function parameters, you
    // shouldn't use them with other variable types.
    model = _model;
    ....
 }

void MyClass::initClass ( cv::Mat& _img, cv::Mat& _mask, myClass& _src, myClass& _dst )
{
    //some work here
}

int main( int argc, const char* argv[] )
{
    cv::Mat test ( height, width, CV_8UC3 );
    cv::Mat test2 ( height, width, CV_8UC3 );
    MyClass auM ( test );
    MyClass buM ( test );
    // as "initClass is a non-static member, you have to instantiate
    // MyClass before calling it:
    MyClass cuM ( test );
    cuM.initClass ( img, img, auM, buM );
}

私が言及した規則は、プログラムを実行するために重要ではありません。それでも、読みやすさと保守性が大幅に向上するため、早い段階で慣れることを強くお勧めします。

于 2012-10-19T23:34:29.863 に答える