Объявление переменной внутри функций класса В C++

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 label (private:), как в заголовочном файле -->

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

первый работает правильно. Но второй-нет. Если я хочу пойти со вторым вариантом, то что мне нужно делать? Правильный код с некоторым объяснением может помочь.

6 ответов


вам не разрешено присваивать значения переменным внутри области класса, вы можете делать это только внутри функции или в глобальной области.

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

Edit - на ваш вопрос в комментариях:

идентификаторов для имен переменных в параметрах функции не должны совпадать между декларацией и определение, только типы и их порядок должны соответствовать. Это делает его более ясным, но не требуется.

прототип функции действительно рассматривается только как следующее:

void MyFill2(Mat, Point);

когда вы даете ему определение, то есть когда назначение идентификаторов действительно имеет значение:

void MyFill2(Mat m, Point p)
{
    //....
}

вы объявить переменные-члены в определении класса, затем в конструкторе вы используете список инициализатора для инициализации переменных-членов:

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

в чем разница между объявлением переменной внутри публичной функции класса, как это (толщина и шаблон)

толщина и тип определяются в объем функция, это называется локальная переменная функции 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
{
}

надеюсь, что это ответ на ваш вопрос.


нельзя назначение значения в объявлении класса. вы должны сделать это в конструктор класс:

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

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

в первом случае объявляются локальные переменные, допустимые только в области функции. Снаружи вы не можете их использовать.

в последнем вы объявили их для области действия класса, чтобы вы могли ссылаться на них в любой функции этого класса.

обратите внимание, что ваш стиль инициализации работает только при использовании компилятора C++11 conform, с C++03 вам нужно будет инициализировать их в своем конструкторе:

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

и только объявить их как

private:
    int thickness;
    int lineType;

Если вам нужны только эти переменные в этой одной функции, перейдите к локальным переменным.


c++11 позволяет инициализировать неконст и нестатические члены внутри объявления класса, вы можете обратиться к обсуждениям в этом страница