Объявление переменной внутри функций класса В 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 позволяет инициализировать неконст и нестатические члены внутри объявления класса, вы можете обратиться к обсуждениям в этом страница