Форум программистов, компьютерный форум CyberForum.ru

Обьекты класса - C++

Восстановить пароль Регистрация
 
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 22:50     Обьекты класса #1
Возник такой вопрос. Есть класс Авто, в котором конструктор считает количество введеных машин. Проблемма в создание нужного количества обьектов класса.Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream.h>
using namespace std;
 
class Avto
{   static int Amount;
    string Info;
public:
   void PutAmount();
   string PutInfo();
   string GetInfo();
   Avto();
};
 
int Avto::Amount;
 
Avto::Avto()
{
  Amount++;  
}
 
string Avto::GetInfo()
{
    cout<<"Введите марку машины: "<<endl;
    cin>>Info;
}
 
void Avto::PutAmount()
{
    cout<<"Количество машин "<<Amount<<endl;
}
 
string Avto::PutInfo()
{
    cout<<"Марка "<<Amount<<" машины: "<<Info<<endl;
}
 
int main() 
{
    int n;
    cout<<"Введите количество машин, которые будут введены: ";
    cin>>n;
    int i;
    for (i=0;i<n;i++)
    {
    Avto Obj[i];
    Obj[i].GetInfo();
    Obj[i].PutInfo();
    };
}
Суть такова. Нужно ввести с клавиатуры количество машин которое надо ввести, и счетчик введеных машин должен быть в конструкторе. Понимаю что код очень корявый, потому может это можно реализовать как-то по-другому?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 22:53     Обьекты класса #2
Leew, вам надо создать динамический массив автомобилей вне цикла, а в цикле только заполнять его.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.10.2012, 22:56     Обьекты класса #3
C++
1
2
3
4
5
int Avto::Amount = 0;
 
void Avto::GetInfo()
 
void Avto::PutInfo()
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 23:00     Обьекты класса #4
I.M., кстати да, то, что статическое поле не инициализируется, я и не заметил.
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:05  [ТС]     Обьекты класса #5
silent_1991, Статическую переменную инициализировал, поменял код главной функции на такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() 
{
    int n;
    cout<<"Введите количество машин, которые будут введены: ";
    cin>>n;
    Avto * p = new Avto[n];
    int i;
    for (i=0;i<n;i++)
    {
    p[i];
    p[i].GetInfo();
    p[i].PutInfo();
    };
}
Но конструктор не работает как надо.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 23:07     Обьекты класса #6
C++
1
Avto * p = new Avto[n]();
И 10 строку удалить. Конструктор вызывается только при создании экземпляра класса, вручную вы его вызвать не можете (то, что вы пытаетесь делать в 10 строке).
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:13  [ТС]     Обьекты класса #7
silent_1991, Переделал. Оно всегда, где должно выводить значение переменной Amount, почему то выводит значение n. Если я пишу что хочу ввести 5 машин, цикл работает, но вместо 1,2,3,4,5 машины пишет, что машина 5 во всех пяти случаях.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 23:20     Обьекты класса #8
Leew, это потому, что когда создаётся массив, конструктор вызывается для каждого элемента. Поэтому после создания счётчик сразу достигнет значения, равного размеру массива. Если надо каждый элемент создавать отдельно - проще всего создать массив указателей, и каждый элемент массива создавать в динамической памяти. Тогда в момент вызова оператора new будет вызываться конструктор.
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:26  [ТС]     Обьекты класса #9
silent_1991,Подскажите, как это можно сделать, плохо разбираюсь в указателях. Или возможно это можно реализовать другим методом, а не в цикле?
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 23:28     Обьекты класса #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() 
{
    int n;
    cout<<"Введите количество машин, которые будут введены: ";
    cin>>n;
    Avto **p = new Avto*[n];
    int i;
    for (i=0;i<n;i++)
    {
    p[i] = new Avto();
    p[i]->GetInfo();
    p[i]->PutInfo();
    };
}
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:51  [ТС]     Обьекты класса #11
silent_1991, большое спасибо за помощь.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.10.2012, 23:53     Обьекты класса #12
Leew, не забудьте правильно очистить память:
C++
1
2
3
4
for (itn i = 0; i < n ++i)
    delete p[i];
 
delete[] p;
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:59  [ТС]     Обьекты класса #13
silent_1991, зачем это нужно делать?
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.10.2012, 00:02     Обьекты класса #14
Leew, потому что иначе память утечёт. Вы разместили объект в куче, а кто занятую память вернёт системе? Сборки мусора в С++ нет. Конечно, в данной конкретной программе можно не очищать память, поскольку по завершении программы вся занятая ею память автоматически вернётся системе, но в реальных приложениях, которые работают долго и создают множество объектов в куче, ненужную больше память следует отдавать системе, иначе приложение может израсходовать всю свободную память и упадёт с ошибкой о нехватке памяти. Правилом хорошего тона является всегда освобождать память, даже в таких простых программах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 00:05     Обьекты класса
Еще ссылки по теме:

C++ Классы и обьекты в С++
C++ Классы и обьекты
Как правильно записывать в динамический массив типа класса обьекты? вот банальный пример C++
Классы и обьекты в С++. Выполнить исследование вызовов конструкторов и деструкторов C++
Потокобезопасно ли одновременно добавлять в конец list обьекты и удалять из середины? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
13.10.2012, 00:05  [ТС]     Обьекты класса #15
silent_1991, благодарю за информацию, очень помогли.
Yandex
Объявления
13.10.2012, 00:05     Обьекты класса
Ответ Создать тему
Опции темы

Текущее время: 12:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru