2016-12-02 4 views
1

Я пытаюсь подсчитать, сколько экземпляров или класс mole2 есть и хранят это число в общедоступной статической переменной mole_count.квалифицированный идентификатор в объявлении перед переменной '=' token/object counter

mole2.h

#ifndef mole2_h 
#define mole2_h 

#include "Arduino.h" 
class mole2 { 
    public: 
    mole2(int input, int output); 
    void popUp(); 
    void popdown(); 
    boolean moleBrainThinkPopUpNow(); 
    void setUpTimer(int up_timer); 
    boolean didMoleGetHit(); 
    void setRecoveryTimer(int recovery_timer); 
    void decrementRecoveryTimer(); 
    boolean dosePlayerMistMole(); 
    void moleReset(); 

    int input, output; 
    static int mole_count; 
    static int odds_of_poping; 

    private: 
    boolean _is_popped = false; 

    int _up_timer = 0; 
    int _recovery_timer = 0; 

}; 
#endif 

mole2.cpp

#include "Arduino.h" 
#include "mole2.h" 

int mole2::odds_of_poping = 10; 

mole2::mole2(int input, int output) { 
    input = input; 
    output = output; 
    int mole2::mole_count = mole2::mole_count + 1; 
    pinMode(input, INPUT); 
    pinMode(output, OUTPUT); 
} 

void mole2::popUp() { 
    _is_popped = true; 
    digitalWrite(input, HIGH); 
} 

void mole2::popdown() { 
    _is_popped = false; 
    digitalWrite(input, LOW); 
} 


boolean mole2::moleBrainThinkPopUpNow() { 
    if (_recovery_timer == 0 && _is_popped == false && rand() % odds_of_poping == 1) { 
    popUp(); 
    return true; 
    } 
    else { 
    return false; 
    } 
} 

void mole2::setUpTimer(int up_timer) { 
    _up_timer = up_timer; 
} 

boolean mole2::didMoleGetHit() { 
    if (_is_popped == true && digitalRead(input) == HIGH) { 
    popdown(); 
    _up_timer = 0; 
    return true; 
    } 
    else { 
    return false; 
    } 
} 

void mole2::setRecoveryTimer(int recovery_timer) { 
    _recovery_timer = recovery_timer; 
} 

void mole2::decrementRecoveryTimer() { 
    if (_recovery_timer > 0) { 
    _recovery_timer--; 
    } 
} 

boolean mole2::dosePlayerMistMole() { 
    if (_is_popped == true && _up_timer > 0) { 
    _up_timer--; 
    } 
    if (_is_popped == true && _up_timer == 0) { 
    popdown(); 
    return true; 
    } 
    else { 
    return false; 
    } 
} 

void mole2::moleReset() { 
    popdown(); 
    _up_timer = 0; 
    _recovery_timer = 0; 
} 

FullError

Arduino: 1.6.12 (Windows 7), Board: "Arduino/Genuino Uno" 

C:\Users\Strings\Documents\Arduino\libraries\mole2\mole2.cpp: In constructor 'mole2::mole2(int, int)': 

C:\Users\Strings\Documents\Arduino\libraries\mole2\mole2.cpp:9:25: error: qualified-id in declaration before '=' token 

    int mole2::mole_count = mole2::mole_count + 1; 

         ^

exit status 1 
Error compiling for board Arduino/Genuino Uno. 

This report would have more information with 
"Show verbose output during compilation" 
option enabled in File -> Preferences. 
+0

Где вы определяете 'mole_count'? Я вижу, что вы определили 'odds_of_poping', но я не вижу' mole_count'. – NathanOliver

ответ

0

Сначала это:

int mole2::mole_count = mole2::mole_count + 1; 

не имеет никакого смысла: вы объявляя что-то и назначение его к своему значению + 1

Во всяком случае, вы уже объявили mole_count в своем классе. Так как вы в конструкторе, вы в mole2 классе уже (далее «Квалифицированный-идентификатор» немного приходит здесь), так что вы просто должны сделать:

mole_count++; 

Кроме того, вы должны объявить хранения для переменной в классе .cpp & инициализации:

int mole2::mole_count = 0; 
0

Вы должны делать то же самое, что и с odds_of_poping:

Определение:

int mole2::mole_count = 0; // initialization can be ommited as static variables are initialized to the default value 

, а затем просто увеличиваем: ++mole_count;

0

int mole2::mole_count уже определен. Это пытается сделать еще один int mole2::mole_count. Потеряйте int и назначьте уже существующую переменную.

Вам также необходимо выделить хранилище и инициализировать mole_count. Поместите

int mole2::mole_count = 0; // replace 0 if starting with more than 0 mole2s 

в где-то около

int mole2::odds_of_poping = 10; 

в mole2.cpp

Также следите за

input = input; 
output = output; 

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

Это может быть решена явно указав

this->input = input; 
this->output = output; 

Or (мой любимый!) С помощью member initializer list

mole2::mole2(int input, int output): input(input), output(output) { 

Но чтобы предотвратить другие путаницы вы все равно должны не повторять имена.