3

コンストラクターを宣言しても「c2512」エラーが発生しました。私のコードは次のようになっています。「first.h」ファイルで、次のように宣言しました。

class myClass
{
public:
    tmpM ( cv::Mat& _model );
}

次に、「first.cpp」で次のことを行いました。

#include "first.h"
myClass::tmpM ( cv::Mat& _model )
{
    ...
}

次に、この「first.h」を「second.h」に含め、次にこの「second.h」を「third.h」に含め、このクラスを「third.cpp」で次のように呼び出しました。

cv::Mat myMat ( height, width, CV_8UC3 );
tmpM aM ( myMat );

しかし、これはc2512エラーを出します。

適切なデフォルトコンストラクタがありません

私は確かにこれについて検索し、デフォルトのコンストラクターを自分で作成する必要があることを発見し、「first.h」で次のようにしようとしました。

class myClass
{
public:
    tmpM ( cv::Mat& _model) {};
}

次に、次のようなエラーが発生しました。

関数"myClass::tmpM"にはすでに本文があります

私はそれを行うために他のいくつかの方法を試しましたが、それでも解決できませんでした。ここでデフォルトのコンストラクターを作成する必要はないと思いますが、それでも気になります。誰かが私を助けてもらえますか?

編集

さて、あなたの提案の後、私はそれをこの形式に変更しました:

class myClass
{
public:
myClass(cv::Mat& _model ) : tmpM (_model)
{
}
private:
cv::Mat& tmpM;
};

次に、「first.cpp」で、次のようなエラーが発生しました

宣言に互換性がありません

これはどのように解決できますか?

4

3 に答える 3

4

ここでの問題は、コンストラクターに名前を付けたものとは別の名前をクラスに付けたことにあるようです。それらは同じ名前でなければなりません。また、渡したモデルへの参照がオブジェクトによって保持されることを望んでいると思います。参照として保持する場合は、コンストラクター初期化子リストで初期化する必要があります。

あなたが欲しい:

class myClass
{
public:
    myClass(cv::Mat& _model ) : tmpM (_model)
    {
    }
private:
    cv::Mat& tmpM;
};
于 2012-10-20T14:25:05.473 に答える
3

そのはず:

class myClass
{
public:
    myClass(cv::Mat& _model ) : tmpM (_model)
    {
    }
};

あなたのバージョンは、と呼ばれる関数を宣言します(それは無効な構文であるため、リターンタイプがありません)tmpM、それはメンバーを初期化しません。

そのタイプのメンバーにはデフォルトのコンストラクターがないため、上記のように行う必要があります。そのため、コンストラクターの初期化リストで初期化する必要があります。

于 2012-10-20T14:24:51.750 に答える
0

デフォルトのコンストラクターは

class myClass {
public:
  myClass();
}
于 2012-10-20T14:25:52.897 に答える