Нужна помощь при вставке строки в функцию - PullRequest
0 голосов
/ 28 августа 2018

Я стремлюсь облегчить повторное программирование в будущем. Программа говорит двигателю вращаться в соответствии с рекомендациями программы производителя. Текущий код будет содержать:

motorname.spin(originallib::directionType::fwd, speed, originallib::velocityUnits::pct);

Я хочу сказать:

int main()
{
run(LeftFront,80);
run(RightFront,80);
}

void run(string motorname, double speed )
{
motorname.spin(originallib::directionType::fwd, speed, originallib::velocityUnits::pct);
}

LeftFront и RightFront были объявлены в предыдущем заголовочном файле как

originallib::motor LeftFront=originallib::motor(originallib::PORT2,
                                                originallib::gearSetting::ratio18_1,
                                                true);

Проблема, с которой я сталкиваюсь:

"ошибка: нет члена с именем spin в std :: basic_string"

Потому что motorname.spin ..... является частью originallib

Как я могу добиться этого?

1 Ответ

0 голосов
/ 29 августа 2018
void run(string motorname, double speed )

Сообщает компилятору, что motorname является std::string. std::string не имеет spin метода. На основании

run(LeftFront,80);

, где LeftFront - это originallib::motor, и, если originallib::motor действительно имеет метод spin, вы действительно функция, похожая на

void run(originallib::motor & motor, 
         double speed)
{
    motor.spin(originallib::directionType::fwd, 
               speed, 
               originallib::velocityUnits::pct);
}

так что motor, который может spin, предоставляется вместо string, который может в лучшем случае std::rotate

В качестве альтернативы использованию имен можно использовать карту из string -> motor пар ключ-значение, в которой вы можете найти имя двигателя на карте и получить сопоставленный motor, для которого вы можете вызвать spin. Здесь это не кажется желательным.

Sidenote:

Вы не хотите

originallib::motor LeftFront=originallib::motor(originallib::PORT2,
                                                originallib::gearSetting::ratio18_1,
                                                true);

в шапке. Это нарушает правила One Definition Rule , если несколько Единиц перевода включают заголовок, так как каждый, включая единицу перевода, будет иметь свой собственный, одинаково действительный, LeftFront. Включить охрану не помешает этому, потому что включающая защита может предотвратить включение заголовка только несколько раз в одну единицу перевода.

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