Я пытаюсь получить простую библиотеку классов для работы в Arduino и боюсь.
Библиотека -.h
#ifndef ADS1X15_h
#define ADS1X15_h
#include "Arduino.h"
class ADS1X15
{
protected:
public:
ADS1X15 ();
void begin(uint8_t i2cAddress);
uint8_t m_i2cAddress;
uint8_t m_test;
private:
};
#endif
Библиотека.cpp
#include "Arduino.h"
#include "ADS1X15.h"
ADS1X15::ADS1X15() {
uint8_t m_i2cAddress;
uint8_t m_test = 99;
}
void ADS1X15::begin(uint8_t i2cAddress) {
uint8_t m_i2cAddress = i2cAddress;
}
Вызов эскиза
#include <ADS1X15.h>
ADS1X15 ads;
void setup(void) {
Serial.begin(9600);
ads.begin(66);
}
void loop(void) {
Serial.print("Test1 ");
Serial.println(ads.m_i2cAddress);
Serial.print("Test2 ");
Serial.println(ads.m_test);
while (1==1) {}
}
Кажется, что выше было напечатать 99 и 66 вместо 0 и 0!?!?!
Заранее спасибо.
Это неверно:
ADS1X15::ADS1X15() {
uint8_t m_i2cAddress;
uint8_t m_test = 99;
}
Он объявляет две локальные переменные конструктору, которые соответствуют именам ваших членов класса. У вас аналогичная ошибка в ADS1X15::begin
. Если у вас есть предупреждения, вы должны получить предупреждение о локальной переменной, затеняющей переменную-член или аналогичную.
Перепишите те, у которых нет объявлений типов, и они обновят ваш класс вместо обновления локальных переменных.
ADS1X15::ADS1X15() {
m_test = 99;
}
void ADS1X15::begin(uint8_t i2cAddress) {
m_i2cAddress = i2cAddress;
}
В вашем cpp:
ADS1X15::ADS1X15() {
uint8_t m_i2cAddress;
uint8_t m_test = 99;
вы обновляете публичные элементы, поэтому, когда вы ссылаетесь на внутренний конструктор, вы получаете закрытую копию вместо публичных членов класса.
Просто используйте:
ADS1X15::ADS1X15() {
m_test = 99;
}
void ADS1X15::begin(uint8_t i2cAddress) {
m_i2cAddress = i2cAddress;
}