Вектор в C ++, используя для цикла - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в C ++ в целом.Поэтому я пытался узнать об использовании векторов после того, как кто-то недавно помог с использованием проекта типа Arduino для чтения меток RFID.Это действительно заставило меня думать, что я понятия не имею, как программировать.Так что я попал в книги!

Итак, вот вопрос: когда я делаю следующий код:

#include <iostream>
#include <vector>

struct Runner{
    char runnerTag[32];
    uint32_t ts;
};

std::vector<Runner > runners;

int main() {
    std::cout << "Hello, Runners!\n";
    for (int i = 0; i < 100; i++) {
        std::string runnertg = "testTrackTag01";
        uint32_t timeStamp = rand() % 100 + 1;
        runners[i] = new Runner({runnertg, timeStamp});
    }
    return 0;
}

, я получаю это раздражающее маленькое сообщение из xcode:

No matching constructor for initialization of 'Runner'

в строке 16приведенный фрагмент.Что в мире я делаю не так?

Ответы [ 3 ]

0 голосов
/ 22 мая 2018
  1. Выражение new Runner({runnertg, timeStamp}) имеет несоответствие типов.runnertg имеет тип std::string, а элемент Runner::runnerTag имеет тип char[32].

  2. Выражение runners[i] = new Runner({runnertg, timeStamp}); имеет другое несоответствие типов.Тип элемента runners равен Runner, а выражение new Runner({runnertg, timeStamp}) имеет тип Runner*.

  3. runners[i] - доступ вне пределов.Размер runners равен 0. Элементы runners[i] для всех значений i не существуют.

  4. Утечка памяти, так как для 10 * нет соответствия длякаждый new для всего пути кода.

  5. Не использовать rand().

0 голосов
/ 22 мая 2018

Большая часть кода, который вы используете, - это старый стиль C с небольшим количеством кода STL на C ++. Я попытаюсь решить несколько вопросов по одному за раз.

struct - это абстрактные данныеТип, используемый (в общем) для организации примитивных типов данных.Хотя единственное различие между struct и class заключается в том, что последний по умолчанию использует все члены как закрытые и в этом случае не работает, это хорошо, чтобы сократить эти вещи на проходе.

Во-вторыхмассив char s громоздок, запутан и подвержен ошибкам.Вместо этого попробуйте std::string.

Наконец, давайте создадим конструктор, принимающий два наших параметра.

Таким образом:

#include <string>

class Runner {
public:
    std::string runnerTag;
    uint32_t ts;

    Runner(std::string, uint32_t);
};

Следующая вещь.Использование оператора индекса массива [] для доступа к std::vector или его изменения опасно и лишает цели использования контейнера и всей замечательной функциональности, которая прилагается к нему.

Поскольку вы знаете циклы, давайтепопробуйте это:

for (int i = 0; i < 100; i++) {
    std::string runnertg = "testTrackTag01";
    uint32_t timeStamp = rand() % 100 + 1;
    Runner Runner(runnertg, timeStamp);
    runners.push_back(Runner);
}

В конце вашего кода, вне области действия основной функции, определите конструктор следующим образом:

Runner::Runner(std::string rt,  uint32_t ts) {
    runnerTag = rt;
    ts = ts;
}

Это должно помочь вам начать.

0 голосов
/ 22 мая 2018

Вы не можете преобразовать std::string в массив char таким образом.Измените тип переменной-члена runnerTag на std::string.Кроме того, вы получаете доступ к векторным элементам, которые не существуют.Используйте resize для их создания.Или еще лучше, используйте emplace_back, чтобы сделать оба сразу.Кроме того, не используйте int для итерации контейнеров, но std::size_t.Кроме того, не используйте rand(), но классы из заголовка <random>.Этот трюк с использованием% создает неравномерное распределение.

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