Ошибка: не удалось преобразовать датчик [] в датчик - PullRequest
0 голосов
/ 22 января 2020

У меня уже есть этот класс

class sensor : iElectronicParts{
    // Some stuff here like methods and properties
};

Для доступа ко всем датчикам я хочу сохранить их в новом объекте с типом global, поэтому я просто кодировал этот класс (нет метода set потому что я уже столкнулся с ошибкой)

class global {
  public:
  sensor getSensors() {
    return sensors; // This line throws the error
  }

  private:
  sensor sensors[10];
};

и получил это сообщение об ошибке

Компиляция эскиза ...

/ tmp / 538691267 / 200119_Growbox / 200119_Growbox.ino: В функции-члене 'sensor global :: getSensors ()':

/ tmp / 538691267 / 200119_Growbox / 200119_Growbox.ino: 335: 12: ошибка: не удалось преобразовать '((глобально *) это ) -> global :: Датчики 'от' датчика [10] 'до' датчика '

датчики возврата;

^ ~~~~~~

состояние выхода 1

Я еще не создал этот объект, я только определил класс. Если я заменю каждое определение типа sensor на int, это сработает.

Может кто-нибудь сказать мне, что я делаю неправильно / что мне нужно сделать, чтобы это исправить?

Ответы [ 2 ]

4 голосов
/ 22 января 2020

В вашем классе хранится массив sensor, но GetSensors пытается вернуть копию одного sensor. Нет преобразования из массива в один sensor, поэтому ваш компилятор не знает, что ему нужно делать.

Вопрос здесь в том, что вы хотите сделать: хотите получить весь список или хотите получить один датчик.

Если вы хотите вернуть весь массив.

C ++ не поддерживает массивы в качестве возвращаемых типов. Вам нужно будет вернуть указатель на первый элемент в вашем массиве.

Код будет выглядеть так:

  sensor* getSensors() {
    return sensors;
  }

, и вы будете использовать его следующим образом при условии, что g является экземпляром global:

sensor* sensors = g.getSensors();
Serial.print(sensors[3].value);

Этот код использует так называемый массив для затухания указателя . Вызывающие функции вашей функции getSensors больше не будут знать, какой размер массива, вы должны убедиться, что go не выходит за границы! Так как при этом возвращается указатель на исходные датчики, любые изменения, которые вы вносите позже в возвращаемый указатель, будут влиять на массив в случае глобального.

Если вы хотите вернуть указанный c датчик

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

sensor& getSensor(int index) {
    return sensors[index];
  }

Возвращает ссылку на указанный c датчик. Как и в случае с указателем, изменения в возвращаемом датчике будут влиять на исходный массив внутри экземпляра global (который, как я предполагаю, является намерением)

Если вы не хотите вносить изменения в исходный массив, вы должны вернуть значение и пропустить & в типе возвращаемого значения.

1 голос
/ 22 января 2020

getSensors () тип возвращаемого значения функции не соответствует. Вы должны вернуть объект датчика , затем выбрать один из датчиков [индекс] или изменить тип возврата на указатель датчика . однако я советую использовать типы stl (это не обязательно, но это лучший способ) @divinas сообщил мне, что в ardunio нет std :: array, так что этот совет не применимо:

#include <memory>
#include <array>
class iElectronicParts{};

class sensor : iElectronicParts{
    // Some stuff here like methods and properties
};

class global {
  public:
    std::array<sensor, 10>& getSensors() {
    return sensors; 
  }

  private:
  std::array<sensor, 10> sensors;
};

int main(){
    return 0;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...