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
    );
}

...并且只是在私有标签(私有:)中声明它们,就像在头文件中一样-->

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

第一个工作正常。但第二个没有。如果我想选择第二个选项,我需要做什么?带有一些解释的正确代码可能会有所帮助。

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

}

通过将粗细lineType放在类 scope中,它们是 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;

如果您只需要在一个函数中使用这些变量,请使用局部变量。

于 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 回答