Error 'A2' is not a type

Hola a todos.

Sigo con mi proyecto de medición de gases. Tengo una placa mkr1010 conectado a un ConnectionCarrier

Uso el sensor http://wiki.seeedstudio.com/Grove-Air_Quality_Sensor_v1.3/ y la librería, GitHub - Seeed-Studio/Grove_Air_quality_Sensor: test for air quality. El ejemplo me corre, aunque da Warning de incompatibilidad de tarjeta

Además, al meter ese código en una clase me da el error ‘A2’ is not a type.

Uso 5 diferentes sensores, con sus librerías, y para ordenarlo todo un poco, he creado una clase, que engloba todos los sensores. No he tenido problemas con las otras 4 librerías, pero esta última se me resiste. Quitando todo lo superfluo se me queda en:

SensObj.h

/*
  SensObj.h - Library for taking some sensor measurements.
  Created by Harutiun, January, 2020.
  Released into the public domain.
*/
#ifndef SensClass_h
#define SensClass_h

#include <Arduino.h>


// Air Quality
// from https://github.com/Seeed-Studio/Grove_Air_quality_Sensor
#include "Air_Quality_Sensor.h"
//AirQualitySensor myAirQualitySensor;    // da error si lo meto dentro de la parte private...





class SensClass 
{
  private:

    AirQualitySensor myAirQualitySensor(A2);    // da error si lo meto dentro de la parte private...


  public:

    SensClass();
    
};

#endif

SensObj.cpp

#include "SensObj.h"

SensClass::SensClass( ){
  init();
}

código principal:

SensClass sensor;



void setup() {

}

void loop(){

}

¿Dónde está el error?

Una solución, podría se rehacer un poco la librería, para no pasarle el pin al crear el objeto. Pero me gustaría saber el error que estoy cometiendo.

Muchas gracias a todos! En breves publicaré el proyecto, a ver que os parece :slight_smile:

No puedes iniciar una instancia de un objeto dentro de la declaración de la clase, al menos cuando esté acepta parametros.

Opciones:

  1. Modificar la libreria Air_Quality_Sensor para que el constructor no tenga parámetros y añadir un método setPin() para decirle que quieres usar. Luego en tu clase al constructor le pasas un parámetro que será el pin y usas la función setPin para asignar el pin.
class SensClass {
  private:
    AirQualitySensor aqs; // Modificada la libreria para que tenga un 
                          // constructor sin parametros.
  public:
    SensClass(int pin) {
      aqs.setPin(pin);
    }
};

SensClass miObjeto(A2);
  1. Usar Herencia. Quizás sea lo mas complicado si no eres ducho en programación orientada a objetos.
// TU CLASE. Hereda de AirQualitySensor.
class SensClass : public AirQualitySensor
{
  private:
    // miembros privados.
  public:
    // EL CONSTRUCTOR
    SensClass(int pin);
};

// Constructor del objeto.
SensClass::SensClass(int pin):AirQualitySensor(pin) {

}

SensClass miObjeto(A2);

Creo que la opción (1) es la más fácil de hacer y llevar a cabo. Tendrás más control sobre lo que pretendes hacer, sobretodo si vas a añadir más sensorer de otro tipo, la cosa se puede desmadrar con herencia multiple.

Se puede aplicar una pequeña variante a la primera propuesta de victorjam para no tener que modificar la librería Air_Quality_Sensor.h. Consiste en invocar al constructor de AirQualitySensor desde el constructor de SensClass antes de que se ejecute el "cuerpo" de este último.

Para ello hay que definir el constructor de la clase SensClass con un parámetro que le indique el pin. Así como declarar el objeto privado del tipo AirQualitySensor, tal como propone victorjam. La clase en SensObj.h quedaría tal que así:

class SensClass
{
  private:

    AirQualitySensor myAirQualitySensor; // Aquí sólo se ha de indicar que la clase tiene un objeto de este tipo


  public:

    SensClass(int pin); // El constructor tiene un parámetro para indicar el pin en que está el sensor
   
};

Se ha de modificar el constructor en SensObj.cpp para que reciba el parámetro. Y que invoque al constructor de myAirQualitySensor con el parámetro recibido antes de ejecutar el "cuerpo" de su fución. Para ello se a de poner : (dos puntos) después de las lista de parámetros: y entre esos dos puntos y la { del la definición del constructor se invoca al constructor de myAirQualitySensor. Quedando tal que así:

#include "SensObj.h"

SensClass::SensClass(int pin) : myAirQualitySensor(pin) // Aquí se está invocando al constructor de myAirQualitySensor, indicando el pin que ha de usar, antes de que se ejecuta el "cuerpo" del la función SensClass
{
  init();
}

Por último, en el programa principal, definimos el objeto sensor del tipo SensClass con el parámetro que indica el pin para myAirQualitySensor:

SensClass sensor(A2);

Gracias chicos. Llevo la POO bastante en los pies :slight_smile: