2013-07-24 4 views
7

MyFill является классом и MyFill2 является функцией внутри этого класса.Объявление переменной внутри функций класса в C++

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

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

что не работает? –

+0

@ umläute: Я получал сообщение об ошибке: только статические константные интегральные элементы данных могут быть инициализированы в классе – ridctg

ответ

4

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

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) 
{ 
    //.... 
} 
+0

Разве это не противоречит тому, что сказано выше? «Поместив толщину и lineType в класс, они являются членами класса MyFill, и они доступны во всех объектах MyFill». – ridctg

+1

@ridctg те переменные выше в конструкторе все еще находятся в классе. Они просто инициализируются, следовательно:. Они не являются локальными. Извините, я не понимаю вопроса :( –

+0

Позвольте мне уточнить, чтобы сделать его более ясным. –

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

Так как инициализация C++ 11 в объявлении класса также возможна. – soon

+0

Список инициализаторов ... Я думаю, что это то, что мне нужно использовать. Спасибо @Joachim – ridctg

+0

@soon: Я использую VS2010. Вот почему я получаю ошибку? – ridctg

1

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

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

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

Обратите внимание, что с C++ 11 вы можете инициализировать членов класса в объявлении класса. – soon

+0

Спасибо umläute и скоро! – ridctg

+0

@ridctg отлично подходит для помощи, но имейте в виду, что политика stackoverflow обескураживает сообщения [thank you] (http://stackoverflow.com/help/someone-answers). –

1

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

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

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

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

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

private: 
    int thickness; 
    int lineType; 

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

+0

Спасибо ... Этот ответ распространенный И я собираюсь попробовать – ridctg

2

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

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

Надеется, что это отвечает на ваш вопрос.

+0

Спасибо. Я думаю, что это ответ. Я сейчас попробую. – ridctg

+0

@ridctg Нет проблем, рад, что это помогло. – billz

0

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

Смежные вопросы