2014-12-15 2 views
0

Я пытаюсь изменить переменную-член внутри метода класса:Переменная не изменяется при его набор из функции

Декларация класса:

class BypassButton{ 

    public: 
     BypassButton(); 
     BypassButton(double x, double y); 

     //methods 
     void setup(); 
     void update(); 
     void draw(); 
     double getX(); 
     double getY(); 
     void toggle(); 

     bool bypassed; 
     double x, y, radius; 

}; 

переменная устанавливается в ч файл следующим образом:

bool bypassed; 

, а затем установить в конструкторе следующим образом:

BypassButton::BypassButton(double x, double y){ 
    this->x = x; 
    this->y = y; 
    bypassed = false; 
} 

Затем я создал функцию, которая переключает эту переменную:

void BypassButton::toggle(){ 
    bypassed = !bypassed; 
} 

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

Но, когда я проверяю значение вне функции, он никогда не изменяется. Я попытался использовать this->, но он не работает.

Это все часть педальной платы, поэтому у меня есть класс Pedal с экземпляром BypassButton. Затем я создаю вектор Pedal плата внутри моего основного класса, и вызвать переключатель следующим образом:

void ofApp::mouseReleased(int x, int y, int button){ 
    for(int i = 0; i < numPedals; i++){ 
     BypassButton bb = pedals.at(i).getBypassButton(); 
     if(x > (bb.x - bb.radius) && x < (bb.x + bb.radius) && y > (bb.y - bb.radius) && y < (bb.y + bb.radius)){ 
      bb.toggle(); 
     } 
    } 
} 

Есть идеи?

+4

[MCVE] (http://stackoverflow.com/help/mcve), пожалуйста, как обычно. –

+0

Можете ли вы опубликовать объявление класса (или его важные бит)? – slugonamission

+0

Да, одна секунда. – nevos

ответ

4
BypassButton bb = pedals.at(i).getBypassButton(); 

Это создает копию кнопки, хранящейся в pedals. Вы изменяете копию, а не оригинал. Вместо этого используйте ссылку:

BypassButton & bb = pedals.at(i).getBypassButton(); 

убедившись, что getBypassButton() возвращает ссылку.

Возможно, было бы уместно запретить копирование класса для предотвращения таких ошибок. Вы можете это сделать, удалив оператора-конструктора копирования и оператора присваивания:

BypassButton(BypassButton const &) = delete; 
void operator=(BypassButton) = delete; 
+2

Кроме того, 'getBypassButton' должен вернуть ссылку. – interjay

+0

@interjay: Спасибо, я этого не заметил. –

+0

ЭТО ДЕЛАЕТ СМЫСЬ СМЫСЛ! Спасибо. – nevos

-1

Один из возможных недостатков: Инициализация переменной в первой строке. Когда вы пишете его как есть, ему будет дана неопределенная ценность. Может быть истинным или ложным.

Вы уверены, что вы назвали конструктор выше?

+0

Да, к сожалению, я уверен ... – nevos

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