Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR Studio 6 C++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Vetal-Soft
Начал изучать С++. И сразу затык. Что я делаю не так?

Код
#include <avr/io.h>

class StepMotor;

int main(void)
{
    StepMotor a;
    while(1)
    {
        a.initSpeed(20);
        a.initStep(20.0);
    }
}

class StepMotor {
    float Step;
    int        Speed;
    
    public:
    void initStep (float step)
    {
        Step = step;
    }
    void initSpeed (int speed)
    {
        Speed = speed;
    }
};

Не компилируется. Ошибка: aggregate 'StepMotor a' has incomplete type and cannot be defined

Код
#include <avr/io.h>

class StepMotor {
    float Step;
    int        Speed;
    
    public:
    void initStep (float step)
    {
        Step = step;
    }
    void initSpeed (int speed)
    {
        Speed = speed;
    }
};

int main(void)
{
    StepMotor a;
    while(1)
    {
        a.initSpeed(20);
        a.initStep(20.0);
    }
}


А так все нормально.

Так же не понятно как правильно организовать проект состоящий из нескольких файлов.
nikkov
Цитата(Vetal-Soft @ Jul 23 2012, 11:09) *
Начал изучать С++. И сразу затык. Что я делаю не так?
...


А что непонятного? В первом фрагменте на момент вызова функций класса StepMotor о самом классе еще ничего не известно, так как он описан ниже.
Vetal-Soft
Т.е. нельзя сначала объявить класс, а потом описать его? (как функцию в Си)

ps. Еще хотел бы узнать как правильно вынести класс в отдельный файл.
nikkov
Цитата(Vetal-Soft @ Jul 23 2012, 11:45) *
Т.е. нельзя сначала объявить класс, а потом описать его? (как функцию в Си)

ps. Еще хотел бы узнать как правильно вынести класс в отдельный файл.


Обявление класса это как раз то, что находится внутри фигурных скобок, т.е.

class
StepMotor
{
float Step;
int Speed;

public:
void initStep (float step);
void initSpeed (int speed);
};

и его обычно выносят в заголовочный файл, типа stepmotor.h
А в stepmotor.cpp определяются методы класса (опять же обычно, но не обязательно):

void StepMotor::initStep (float step)
{
...
}

Да, и класс с внутренними переменными без конструктора это нехорошо, какое значение будет у Step и Speed первоначально?
_Артём_
Цитата(nikkov @ Jul 23 2012, 08:09) *
какое значение будет у Step и Speed первоначально?

Они будут равны нулю
Vetal-Soft
Спасибо. Все встало на свои места))

Это моя первая программа на С++.
С конструкторами и деструкторами более менее понятно. Буду плавно разбираться по мере изучения.

nikkov
Цитата(_Артём_ @ Jul 23 2012, 12:34) *
Они будут равны нулю


Не факт :-) . Все зависит от компилятора, я стандарт не изучал, но по крайней мере лет 10 назад сталкивался с тем, что переменные не инициализировались. С тех пор инициализирую их сам в конструкторе, и мне спокойней, и тому, кто мою программу читает понятней.
Сергей Борщ
QUOTE (_Артём_ @ Jul 23 2012, 08:34) *
Они будут равны нулю
Если объект класса объявлен глобально. Если же локально - будут содержать случайные значения. Точно так же, как и обычныме переменные.
_Артём_
Цитата(nikkov @ Jul 23 2012, 08:42) *
Не факт :-) .

Факт. Но не весь, а одна его половина.
Как написал Сергей Борщ есть ещё второй случай, про который я не вспомнил, когда писал - локальные переменные.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.