реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AVR Studio 6 C++
Vetal-Soft
сообщение Jul 23 2012, 04:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074



Начал изучать С++. И сразу затык. Что я делаю не так?

Код
#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);
    }
}


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

Так же не понятно как правильно организовать проект состоящий из нескольких файлов.
Go to the top of the page
 
+Quote Post
nikkov
сообщение Jul 23 2012, 04:35
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332



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


А что непонятного? В первом фрагменте на момент вызова функций класса StepMotor о самом классе еще ничего не известно, так как он описан ниже.
Go to the top of the page
 
+Quote Post
Vetal-Soft
сообщение Jul 23 2012, 04:45
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074



Т.е. нельзя сначала объявить класс, а потом описать его? (как функцию в Си)

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

Сообщение отредактировал Vetal-Soft - Jul 23 2012, 04:57
Go to the top of the page
 
+Quote Post
nikkov
сообщение Jul 23 2012, 05:09
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332



Цитата(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 первоначально?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 23 2012, 05:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(nikkov @ Jul 23 2012, 08:09) *
какое значение будет у Step и Speed первоначально?

Они будут равны нулю
Go to the top of the page
 
+Quote Post
Vetal-Soft
сообщение Jul 23 2012, 05:34
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074



Спасибо. Все встало на свои места))

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

Go to the top of the page
 
+Quote Post
nikkov
сообщение Jul 23 2012, 05:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332



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


Не факт :-) . Все зависит от компилятора, я стандарт не изучал, но по крайней мере лет 10 назад сталкивался с тем, что переменные не инициализировались. С тех пор инициализирую их сам в конструкторе, и мне спокойней, и тому, кто мою программу читает понятней.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 23 2012, 06:16
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Артём_ @ Jul 23 2012, 08:34) *
Они будут равны нулю
Если объект класса объявлен глобально. Если же локально - будут содержать случайные значения. Точно так же, как и обычныме переменные.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 23 2012, 10:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(nikkov @ Jul 23 2012, 08:42) *
Не факт :-) .

Факт. Но не весь, а одна его половина.
Как написал Сергей Борщ есть ещё второй случай, про который я не вспомнил, когда писал - локальные переменные.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 04:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016