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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
#1

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

12.10.2012, 22:50. Просмотров 493. Ответов 14
Метки нет (Все метки)

Возник такой вопрос. Есть класс Авто, в котором конструктор считает количество введеных машин. Проблемма в создание нужного количества обьектов класса.Вот код:

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();
    };
}
Суть такова. Нужно ввести с клавиатуры количество машин которое надо ввести, и счетчик введеных машин должен быть в конструкторе. Понимаю что код очень корявый, потому может это можно реализовать как-то по-другому?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2012, 22:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обьекты класса (C++):

Как правильно записывать в динамический массив типа класса обьекты? вот банальный пример - C++
#pragma once #include &quot;iostream&quot; namespace Program { class Book { typedef unsigned int ui; private:

Обьекты - C++
Помогите решить задачу Составить описание класса для представления комплексных чисел с возможностью задания вещественной и мнимой...

Обьекты и классы - C++
Здравствуйте! Изучаю С++. Решил написать а-ля симулятор банкомата для закрепления материала, да вот чтот не срослось =(. Вот текст: ...

Классы и обьекты - C++
Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Выполнить исследование вызовов ...

Классы и обьекты в С++ - C++
очень прошу помочь написать программу. т.к. в программировании я 0:( Написать программу, в которой создаются и разрушаются объекты,...

Классов и обьекты - C++
Учу с++ по учебнику. Набрал такую вот программу, и сразу выскочила масса ошибок. Некоторые из них были очевидны и я их исправил, но пара...

14
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.10.2012, 22:53 #2
Leew, вам надо создать динамический массив автомобилей вне цикла, а в цикле только заполнять его.
0
I.M.
565 / 548 / 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()
1
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.10.2012, 23:00 #4
I.M., кстати да, то, что статическое поле не инициализируется, я и не заметил.
0
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();
    };
}
Но конструктор не работает как надо.
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.10.2012, 23:07 #6
C++
1
Avto * p = new Avto[n]();
И 10 строку удалить. Конструктор вызывается только при создании экземпляра класса, вручную вы его вызвать не можете (то, что вы пытаетесь делать в 10 строке).
0
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 во всех пяти случаях.
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.10.2012, 23:20 #8
Leew, это потому, что когда создаётся массив, конструктор вызывается для каждого элемента. Поэтому после создания счётчик сразу достигнет значения, равного размеру массива. Если надо каждый элемент создавать отдельно - проще всего создать массив указателей, и каждый элемент массива создавать в динамической памяти. Тогда в момент вызова оператора new будет вызываться конструктор.
0
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:26  [ТС] #9
silent_1991,Подскажите, как это можно сделать, плохо разбираюсь в указателях. Или возможно это можно реализовать другим методом, а не в цикле?
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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();
    };
}
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:51  [ТС] #11
silent_1991, большое спасибо за помощь.
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
12.10.2012, 23:59  [ТС] #13
silent_1991, зачем это нужно делать?
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.10.2012, 00:02 #14
Leew, потому что иначе память утечёт. Вы разместили объект в куче, а кто занятую память вернёт системе? Сборки мусора в С++ нет. Конечно, в данной конкретной программе можно не очищать память, поскольку по завершении программы вся занятая ею память автоматически вернётся системе, но в реальных приложениях, которые работают долго и создают множество объектов в куче, ненужную больше память следует отдавать системе, иначе приложение может израсходовать всю свободную память и упадёт с ошибкой о нехватке памяти. Правилом хорошего тона является всегда освобождать память, даже в таких простых программах.
1
Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
13.10.2012, 00:05  [ТС] #15
silent_1991, благодарю за информацию, очень помогли.
0
13.10.2012, 00:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 00:05
Привет! Вот еще темы с ответами:

Классы и обьекты - C++
Народ покажите плиз как это делается а то пока вьехать не могу((

Классы и обьекты - C++
Извините, вот возник вопрос с заданием. А именно, как передать конструктору Patient параметры(Фамилия, имя и тд), так чтобы они были в...

обьекты как элементы массива - C++
Интересует вопрос: можно ли в данном фрагменте кода вместо оператора switch использовать массив? int main() { int id; ...

Помогите понять и исправить ошибку (статические обьекты) - C++
Недавно начал разбираться в новой теме и тут же с примером ошибка... (компилятор выдает 2 ошибки смысл которых мне относительно ясен но...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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