8

MyFillはクラスで、MyFill2はそのクラス内の関数です。

このようなクラスのパブリック関数内で変数を宣言することの違いは何ですか(太さと線の種類)->

MyFill::MyFill (Mat img, Point center)
{
    MyFill2 (img, center);
}

void MyFill::MyFill2(Mat img, Point center)
{
    int thickness = -1;
    int lineType = 8;
    circle (
        img,
        center,
        w/32,
        Scalar( 0, 0, 255 ),
        thickness,
        lineType
    );
}

...そして、ヘッダー ファイルのように、プライベート ラベル (private:) で宣言するだけです -->

class MyFill {
public:
    MyFill(Mat img1, Point center1);
    void MyFill2 (Mat img, Point center);
private:
    int thickness = -1;
    int lineType = 8;
};

最初のものは正しく動作します。しかし、2番目のものはそうではありません。2 番目のオプションを使用したい場合、何をする必要がありますか? いくつかの説明を含む正しいコードが役立つ場合があります。

4

6 に答える 6

5

クラスのスコープ内で変数に値を代入することは許可されていません。これは、関数内またはグローバル スコープ内でのみ行うことができます。

class MyFill {
public:
MyFill(Mat img1, Point center1);
void MyFill2 (Mat img, Point center);
private:
int thickness;
int lineType;
};

ヘッダーを上記に変更する必要があります。次に、好きな関数に値を設定します。できればコンストラクターを次のように設定します。

MyFill::MyFill(Mat img1, Point center1)
{
     thickness = -1;
     lineType = 8;
}

編集 - コメントの質問に:

関数パラメーターの変数名の識別子は、宣言と定義の間で一致する必要はありません。型とその順序のみが一致する必要があります。より明確になりますが、必須ではありません。

関数プロトタイプは、実際には次のようにしか見えません。

void MyFill2(Mat, Point);

定義を与えると、識別子の割り当てが本当に重要になります。

void MyFill2(Mat m, Point p)
{
    //....
}
于 2013-07-24T11:05:35.380 に答える
3

このようなクラスのパブリック関数内で変数を宣言することの違いは何ですか(太さと線の種類

太さと線の種類は関数スコープで定義されており、MyFill2 関数のローカル変数と呼ばれます。

void MyFill::MyFill2(Mat img, Point center)
{
    int thickness = -1; // thickness is a local variable in MyFill2,
                        // it's destroyed when MyFill2 function goes out of scope
                        // thickness is not accessable in any other member function of MyFill
                        // or object.
    int lineType = 8;   // same here

}

太さと線の種類をクラス スコープに配置することにより、それらはクラス MyFill のメンバーになり、すべての MyFill オブジェクトで使用できます

class MyFill {
private:
    int thickness = -1;  // this is a C++11 form of initialize class member. 
                         // In C++03, you need to initialize them in constructor 
                         // thickness is a member of MyFill, it will exist in all life of MyFill object.
    int lineType = 8;
};

C++03 では、メンバー初期化子リストでクラス メンバーを初期化できました。

MyFill::MyFill(Mat img1, Point center1)
    : thickness(0), lineType(0)  // Initializer list to initialize the member variables
{
}

これがあなたの質問に答えることを願っています。

于 2013-07-24T11:11:49.220 に答える
2

クラス定義でメンバー変数を宣言し、コンストラクターで初期化子リストを使用してメンバー変数を初期化します。

class MyFill {
public:
    MyFill(Mat img1, Point center1);
    void MyFill2 (Mat img, Point center);

private:
    // Just declare the member variables
    int thickness;
    int lineType;
};

// ...

MyFill::MyFill(Mat img1, Point center1)
    : thickness(-1), lineType(8)  // Initializer list to initialize the member variables
{
    MyFill2(img1, center1);
}
于 2013-07-24T11:05:48.580 に答える
1

前者の場合、関数スコープ内でのみ有効なローカル変数を宣言します。外では使用できません。

後者では、クラスのスコープに対してそれらを宣言したため、そのクラスの任意の関数でそれらを参照できました。

初期化のスタイルは、C++11 準拠コンパイラを使用している場合にのみ機能することに注意してください。C++03 では、コンストラクターでそれらを初期化する必要があります。

MyFill::MyFill(Mat img1, Point center1)
    : thickness(-1), lineType(8)
{ /* ... */ }

そしてそれらを次のように宣言するだけです

private:
    int thickness;
    int lineType;

その 1 つの関数でこれらの変数のみが必要な場合は、ローカル変数を使用してください。

于 2013-07-24T11:07:43.173 に答える
1

クラス宣言で値を割り当てることはできません。クラスのコンストラクターでそれを行う必要があります。

class MyFill {
public:
    MyFill(Mat img1, Point center1);
private:
    int thickness ;
    int lineType;
};

MyFill::MyFill(Mat img1, Point center1) : thickness(-1), lineType(8) {
  // ...
}
于 2013-07-24T11:06:34.863 に答える
0

C++11 では、クラス宣言内で非 const および非静的メンバーの初期化が可能です。このページの説明を参照してください。

于 2016-05-19T20:04:42.310 に答える