Технический форум по робототехнике.
sergKyrnosov » 05 сен 2013, 09:33
Хочу сделать класс в котором одно из свойств является другим классом.
#include "Arduino.h"
#include "Ultrasonic.h"
class Class1
{
public:
Class1();
void AsseptSonar(int pinTriger, int pinEcho);
long GetSonarDistans();
private:
int _pinSonarTriger;
int _pinSonarEcho;
Ultrasonic sonar;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
В этом месте ругается
:
Class1.cpp:5: error: no matching function for call to 'Ultrasonic::Ultrasonic()'
/Ultrasonic.h:21: note: candidates are: Ultrasonic::Ultrasonic(int, int)
/Ultrasonic.h:19: note: Ultrasonic::Ultrasonic(const Ultrasonic&)
Как правильно определять типы свойств классов которые являются другими классами?
};
#endif
Alex080969 » 05 сен 2013, 09:36
а нафига темы плодить то?
sergKyrnosov » 05 сен 2013, 09:50
Когда отправлял сообщение на форум то оно не отправлялось никак нажал несколько раз на отправить вот оно наверное и наплодилось
Angel71 » 05 сен 2013, 10:16
elmot » 05 сен 2013, 10:20
Очевидно хочет дефолтный конструктор(который без параметров) в классе Ultrasonic.
Если таковой добавить невозможно, то можно попробовать добавить во все конструкторы Class1 явные вызовы конструкторов Ultrasonic.
ЗЫ. C++ на 8мибитниках - извращение. ИМХО.
Angel71 » 05 сен 2013, 10:33
sergKyrnosov » 05 сен 2013, 11:12
elmot писал(а):Очевидно хочет дефолтный конструктор(который без параметров) в классе Ultrasonic.
Если таковой добавить невозможно, то можно попробовать добавить во все конструкторы Class1 явные вызовы конструкторов Ultrasonic.
ЗЫ. C++ на 8мибитниках - извращение. ИМХО.
странно при определении переменной зачем нужен конструктор.
Конструктор нужен при ее создании.
Angel71 » 05 сен 2013, 13:14
жесть. хорошо, допустим вы где-то отрыли тупейше-припримитивнейший компилятор, он вам откомпилил этот недокод и при исполнении доходит до создания объёкта, опа, а конструктора та нет.
elmot » 05 сен 2013, 15:17
sergKyrnosov писал(а):странно при определении переменной зачем нужен конструктор.
Конструктор нужен при ее создании.
Это не переменная ссылка, это сам объект. У внешнего класса есть конструктор(дефолтный или явный), он в явном или неявном виде вызывает конструкторы суперклассов и вложенных полей. Одного из конструкторов нету. Вот и ой.
sergKyrnosov » 05 сен 2013, 15:50
Angel71 писал(а)::crazy: жесть. хорошо, допустим вы где-то отрыли тупейше-припримитивнейший компилятор, он вам откомпилил этот недокод и при исполнении доходит до создания объёкта, опа, а конструктора та нет.
При определении переменной выделяется всего лишь память.
При ее создании уже происходит инициализация.
Даже в томже C#
когда вы определяете переменную, то вроде никаких конструкторов не вызывается.
А потом когда New тогда и конструкторы работают
Может я где то не прав.
elmot » 05 сен 2013, 16:15
Конечно не прав. Компилятор валится с этими матюгами ДО создания переменной, ДО выделения памяти, и даже ДО запуска программы, а еще на фазе построения кода класса, в compile time. Ему не хватает метода, он и ругается.
Читайте Страуструпа, короче.
sergKyrnosov » 05 сен 2013, 16:59
Вот код на C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication14
{
class Program
{
static void Main(string[] args)
{
Class1 per1;
per1 = new Class1();
}
}
class Class1
{
Class2 _var1;
public Class1()
{
_var1 = new Class2();
}
}
class Class2
{
}
}
Все работает, вроде
Romikgy » 05 сен 2013, 18:52
зачем равнять то, где памяти для выполнения и скорости в достатке , с тем где не памяти нормально , ни скорости ... возьмите тогда ARM и там будет все вплоть до дот нета....
Angel71 » 05 сен 2013, 19:07
sergKyrnosov писал(а):Даже в томже C#
когда вы определяете переменную, то вроде никаких конструкторов не вызывается.
А потом когда New тогда и конструкторы работают
Может я где то не прав.
это же азы
не важно, прописали ли вы явно в классе конструктор или нет, паблик он, статик или ещё какой, но он ВСЕГДА ЕСТЬ. в шарпе любой класс по иерахрхии всегда восходит к обджекту, у которого опять таки есть конструктор. не верите, так почитайте самоучители, мсдн, пройдитесь дебаггером или натравите дизассемблер (как увидите ".ctor", так знайте, что это и есть конструктор). проехали с шарпом, это совсем другой язык.
в данном случае вам компилятор сразу и выдал, что он не может найти нужный конструктор. как вы себе представляете инициализацию класса, если компилятор в недоумении репу чешит, какой же конструктор использовать?
как на фото - этот не подходит и этот и тот,... да ну ёпрст... вот вам компилятор всё правильно и выдал "что вы мне подсунули? пЭрЭдЭлать!"
sergKyrnosov » 05 сен 2013, 22:29
если можно для общего развития объясните: инициализация класса когда происходит,
когда определяет перемен ную
Class2 _var1
или тут
_var1 = new Class2();
заранее спасибо