roboforum.ru

Технический форум по робототехнике.

Программирование клссов для ардуино

Re: Программирование клссов для ардуино

Angel71 » 05 сен 2013, 22:42

в данном случае new. а так, есть варианты, где и как может быть заныкано создание инстанса.

Re: Программирование клссов для ардуино

elmot » 06 сен 2013, 09:31

Второй случай.

В приведенном примере на С# код по факту СОВСЕМ другой - у Class2 есть неявный дефолтный конструктор. Добавьте туда что-то типа
Код: Выделить всёРазвернуть
public class Class2(int param)
{}

т.е. явный недефолтный конструктор(тем самым уничтожив неявный дефолтный), и все обломится.

И таки да, в C++ с конструкторами и наследованием полная кхм... То есть там все логично, но уж очень наворочено. C# и Java запилили во многом из-за этого.
Для полной ясности:
Код: Выделить всёРазвернуть
class Class1
{
public:
Class1();
Ultrasonic sonar;
}

заставляет компилятор сделать такое(java-подобный псевдокод)
Код: Выделить всёРазвернуть
Class1::Class1()
{
   super();
   sonar = new Ultrasonic();
}

и тут - оппачки, а Ultrasonic::Ultrasonic()- то и нету, о чем и было доложено.

Добавлено спустя 6 минут 10 секунд:
Romikgy писал(а):зачем равнять то, где памяти для выполнения и скорости в достатке , с тем где не памяти нормально , ни скорости ... возьмите тогда ARM и там будет все вплоть до дот нета....

Я согласен с Арамисом. С++ а аврах - изврат, для программ с ООП нужно больше ресурсов, упретесь быстро в дифицит памяти. Возьмите дешевый ARM, цена будет та же, зато ресурсов больше, и языки на любой вкус.

Re: Программирование клссов для ардуино

RoboHobbyRu » 06 сен 2013, 11:29

sergKyrnosov во втором случае если считать что _var1 - указатель, то оба варианта вызывают конструктор класса (который и инициализирует вновь создаваемый объект)

Если же во втором случае не указатель, то это приведёт к ошибке компиляции.

А вообще приведи код из Ultrasonic.h

Re: Программирование клссов для ардуино

Angel71 » 06 сен 2013, 16:37

RoboHobbyRu, очень похоже, что это был кусочек кода из приведенного ранее примера на шарпе. в шарпе указателей в том виде, как они существуют в си или ++, нет - есть ссылочные типы и типы значений. указатели как таковые доступны или в небезопастном/неуправляемом коде или если осущствлять преобразование указатьль-обджект. с таблетачкой "копай" доступны и прочие плюшки - вызов любых ф-ий (stdcall, cdecl и прочих), нативный процессорный код (cpu/fpu/gpu/...) и т.д.

Re: Программирование клссов для ардуино

RoboHobbyRu » 08 сен 2013, 14:11

да, это я не до понял.

По первому посту могу сказать следующее:
Т.к. компилятор предложил в качестве кандидата конструктор
Ultrasonic::Ultrasonic(int, int)
это значит, что человек описал его.
Но по стандарту Си++, если человек создал руками хоть один конструктор, то компилятор беолее не предоставляет конструктор по умолчанию (Ultrasonic::Ultrasonic() ) считая, что человек знает что делает.
Самый простой способ выйти из этого положения создать его самостоятельно:
Ultrasonic::Ultrasonic(){}
(если такой конструктор по смыслу допустим)

Re: Программирование клссов для ардуино

nut.code.monkey » 27 сен 2013, 01:51

Компилятор подсказывает, что конструкторов без параметров для этого класса не задано. Есть только конструктор с двумя интовыми переменными.
Поскольку конструктор копирования для этого класса задан (его мы тоже видим в ошибке), то самый простой и правильный способ - это передать нужные параматры в конструкторе:
Код: Выделить всёРазвернуть
#define firstIntParameter = …
#define secondIntParameter = …

class Class1
{
  Ultrasonic sonar;
public:
  // в конструкторе, после ":" можно инициализировать переменные класса:
  Class1() : sonar( Ultrasonic(firstIntParameter, secondIntParameter) )
  { /* здесь остальная инициализация */ };
};


cron
Rambler\'s Top100 Mail.ru counter