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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 124, средняя оценка - 4.87
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
#1

Создание Массива Объектов класса - C++

05.10.2011, 00:37. Просмотров 17070. Ответов 7
Метки нет (Все метки)

Здравствуйте,

такая вот проблемка возникла: нужно создать массив B[m] объектов класса TGoods. И далее по определенному значению year найти все объекты из массива у которых year точно такой же + вывести на экран name совпавших year.

вроде все правильно сделал. компилируется все хорошо. но когда начинаю заполнять массив объектов вываливается ошибка.
подскажите пожалуйста в чем дело

код программы
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <string.h>
 
using namespace std;
 
class TGoods
{
    char *name;
    int year;
 
public:
    TGoods();
    TGoods(char *myN,int myD);
    TGoods(int *I);     //получающий параметр –ссылку на класс TGoods
    ~TGoods();
 
    void in();
    void out();
    char search(int search);
};
 
 
/*========================== KONSTRUKTORS ==========================*/
TGoods::TGoods()
{
    name=new char[25];
    year=0;
}
 
TGoods::TGoods(char *myN,int myD)
{
    //name=new char[strlen(myN)+1];
    strcpy(name,myN);
    year=myD;
 
}
 
TGoods::~TGoods()
{
    delete[] name;
}
 
/*========================== FUNCTION ==========================*/
void TGoods::in()
{
    cout<<"Введите наименование товара\t";
    cin>>name;
    cout<<"Введите год производства\t";
    cin>>year;
}
 
void TGoods::out()
{
    cout<<"Наименование товара\t"<<name<<endl;
    cout<<"Год производства\t"<<year<<endl;
}
 
char TGoods::search(int search)
{
    if(year==search)
        return name[25];
    else
        return 0;
}
/*========================== MAIN ==========================*/
void main()
{
    setlocale(LC_ALL, "Russian");
    TGoods A;
 
    cout<<"Проверяем работу функций..\n";
    A.in();
    A.out();
 
    int m,search,i;
    char *O=new char[25];
    cout<<"введите размер массива ";
    cin>>m;
    TGoods *B;
    B=new TGoods[m];
    for(i=0;i<m;i++)
        B[m].in();
 
    cout<<"введите год товара который будем искать ";
    cin>>search;
 
    for(i=0;i<m;i++)
    {
        *O=B[m].search(search);
        if(*O!=0)
            cout<<O[25]<<endl;
    }
 
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2011, 00:37     Создание Массива Объектов класса
Посмотрите здесь:

Создание двух объектов класса Employee C++
C++ Создание класса-агрегата объектов
C++ Создание объектов класса и обращение к ним
Построение описания класса, создание и уничтожение объектов этого класса C++
C++ Создание массива объектов класса
Создание списка объектов собственного класса (SQL) C++
Автоматическое создание объектов класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
05.10.2011, 15:18     Создание Массива Объектов класса #2
Цитата Сообщение от GBIT Посмотреть сообщение
class TGoods
{
* * * * char *name;
* * * * int year;
Думаю проблемма в динамическом выделении памяти в конструкторе
Цитата Сообщение от GBIT Посмотреть сообщение
TGoods::TGoods()
{
* * * * name=new char[25];
* * * * year=0;
}
Почему бы private переменную name сразу не сделать строкой
C++
1
2
3
4
5
6
class TGoods
{
        char name[25];
        int year;
 
public:
Добавлено через 3 минуты
PS:
Цитата Сообщение от GBIT Посмотреть сообщение
#include <iostream>
#include <string.h>
- Если уж пишем заголовки в новом стиле так тогда все

C++
1
2
#include <iostream>
#include <сstring>
Добавлено через 17 минут
Цитата Сообщение от GBIT Посмотреть сообщение
char search(int search);
А это уже не совсем понятно eturn name[25];- в случае char * name возвращаем 25-й символ (т.е '\0' - и то толко в Debug)
Цитата Сообщение от GBIT Посмотреть сообщение
char TGoods::search(int search)
{
* * * * if(year==search)
* * * * * * * * return name[25];
* * * * else
* * * * * * * * return 0;
}
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
05.10.2011, 15:46     Создание Массива Объектов класса #3
Главная проблема -- в декомпозиции. Сущности выделены не очень корректно.

Например, почему класс Goods назван во множественном числе? Зачем в классе Goods есть метод search? Что он ищет внутри одного объекта? Получается не логично -- товар ищет сам себя в списке.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdlib>
 
class Good {
 public:
  Good() : year_(0), name_(NULL) {}
  Good(int year, const char *name)
   : year_(year),
   name_(strcpy(new char[strlen(name) + 1], name)) {}
  void setYear(int year) { year_ = year; }
  int getYear() const { return year_; }
  void setName(const char *name) {
    delete name_;
    name_ = strcpy(new char[strlen(name) + 1], name);
  }
  const char *getName() const { return name_; }
  virtual ~Good() {
    delete [] name_;
  }
  friend std::ostream &operator<<(std::ostream &stream,
    const Good &good) {
    return stream << "Name: " << good.getName() << std::endl
      << "Year: " << good.getYear() << std::endl;
  }
 private:
  int year_;
  char *name_;
};
 
char *randomSymbols(size_t n, char *buffer) {
  buffer[n] = '\0';
  for (size_t i = 0; i < n; ++i)
    buffer[i] = 'a' + rand() % ('z' - 'a' + 1);
  buffer[0] += 'A' - 'a';
  return buffer;
};
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  size_t goodsCount = rand() % 5 + 15;
  Good *goods = new Good[goodsCount];
 
  char buffer[11];
  for (size_t i = 0; i < goodsCount; ++i) {
    goods[i].setName(randomSymbols(9, buffer));
    goods[i].setYear(rand() % 7 + 2005);
    std::cout << goods[i];
  }
 
  // поиск товара по году:
  int year = rand() % 6 + 2009;
  std::cout << std::endl << "Searching for good with year " << year
    << std::endl;
 
  for (size_t i = 0; i < goodsCount; ++i)
    if (goods[i].getYear() == year)
      std::cout << goods[i];
 
  delete [] goods;
  return 0;
}
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
05.10.2011, 20:00  [ТС]     Создание Массива Объектов класса #4
так. Я конечно до этого обращения на форум понимал, что я не знаток C++. Но хотя бы считал, что умею программировать на нем. Сейчас ощущение, что даже этого не умею.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS: - Если уж пишем заголовки в новом стиле так тогда все
C++
1
2
#include <iostream>
#include <сstring>
не знал. учту.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А это уже не совсем понятно eturn name[25];- в случае char * name возвращаем 25-й символ (т.е '\0' - и то толко в Debug)
ок. все понял. но это не суть. до этого момента у меня программа не доходит) падает по дороге.

Цитата Сообщение от lemegeton Посмотреть сообщение
почему класс Goods назван во множественном числе?
Делаю лабораторную. Там название класса обозначено "Объявите класс TGoods, создающий тип – товар."
Цитата Сообщение от lemegeton Посмотреть сообщение
Зачем в классе Goods есть метод search? Что он ищет внутри одного объекта? Получается не логично -- товар ищет сам себя в списке.
Опять же по заданию лабораторной
Напишите функции – методы класса:
- определения, относится ли год производства товара к какому – либо, значение которого передается через параметр;

lemegeton, ушел твой код разбирать)
БОЛЬШОЕ спасибо за него!


Код порождает кучу вопросов. Не исключаю вероятности, что они глупые.
- Почему деструктор виртуальный?
C++
1
2
3
4
virtual ~Good()
{
    delete [] name_;
}
Добавлено через 34 минуты
- что такое size_t и вообще что он как он. почему именно он тут а не int например? чисто из логики догадываюсь что это тип, но не понимаю его.
первый раз натыкаемся тут:
Цитата Сообщение от lemegeton Посмотреть сообщение
size_t TGoodssCount = rand() % 5 + 15;
-зачем у main аргументы? ее же вообще никто не вызывает
Цитата Сообщение от lemegeton Посмотреть сообщение
int main(int argc, char *argv[])
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.10.2011, 20:11     Создание Массива Объектов класса #5
малаца, что интересуешься. вопросы не глупые, а нормальные.
1) деструктор виртуальный для того чтобы правильно удалялись объекты производных классов, созданные по указателю на базовый. вещь здесь явно не 1ой важности, но пусть будет.
http://habrahabr.ru/blogs/cpp/64280/

2) size_t объявлен в некоторых заголовочных файлах как
C
1
typedef size_t unsigned int;
его используют как короткую версию uint , когда хотят показать что имеем дело с количеством предмета, которое не м.б. отрицательным.

3) аргументы мейн нужны чтобы открывать программу с параметрами из командной строки. здесь тоже в принципе не нужны.
http://lord-n.narod.ru/download/book..._C/06/0604.htm
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
05.10.2011, 21:55  [ТС]     Создание Массива Объектов класса #6
Всем БОЛЬШОЕ спасибо! Вот уж не ожидал такой помощи от этого форума
Отдельное спасибо lemegeton!!!
По сути весь код написал он. Я его только переделал под себя.
Выкладываю всю программу. Может кому поможет

Объявите класс TGoods, создающий тип – товар.
Элементы – данные класса – наименование товара, год производства.
Предусмотрите конструкторы класса:
- по умолчанию;
- получающий параметры;
- получающий параметр –ссылку на класс TGoods
Напишите функции – методы класса:
- определения, относится ли год производства товара к какому – либо, значение которого передается через параметр;
- определения, совпадает ли наименование товара со значением, передаваемым в виде параметра.
Напишите программу, в которой создайте массив объектов типа TGoods, заполните его в диалоговом режиме и найдите в этом массиве все товары определенного наименования, дата производства которых соответствует, например, 1998 году.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdlib>
 
class TGoods
{
public:
    TGoods() : year_(0), name_(NULL)
    {
    }
    TGoods(int year, const char *name): year_(year),name_(strcpy(new char[strlen(name) + 1], name))
    {
    }
 
    void set()
    {
        int year;
        char name[25];
 
        std::cout<<"Enter name of goods\t";
        std::cin>>name;
        delete name_;
        name_ = strcpy(new char[strlen(name) + 1], name);
 
        std::cout<<"Enter year\t";
        std::cin>>year;
        year_ = year;
    }
    void TGoods::out()
    {
        std::cout<<"Name of goods\t"<<name_<<std::endl;
        std::cout<<"Year of goods\t"<<year_<<std::endl;
    }
    void setYear(int year)
    {
        year_ = year;
    }
    int getYear() const
    {
        return year_;
    }
    void setName(const char *name)
    {
        delete name_;
        name_ = strcpy(new char[strlen(name) + 1], name);
    }
    const char *getName() const
    {
        return name_;
    }
    
    virtual ~TGoods()
    {
        delete [] name_;
    }
    
    friend std::ostream &operator<<(std::ostream &stream, const TGoods &TGoods)
    {
        return stream << "Name: " << TGoods.getName() << std::endl << "Year: " << TGoods.getYear() << std::endl;
    }
private:
    
    int year_;
    char *name_;
};
 
int main(int argc, char *argv[])
{
    srand(time(NULL));
    int TGoodssCount,year;
 
    std::cout<<"Enter Count Array of Objects ";
    std::cin>>TGoodssCount;
    TGoods *TGoodss = new TGoods[TGoodssCount];
 
    for (int i = 0; i < TGoodssCount; ++i)
    {
        /*TGoodss[i].setName(randomSymbols(9, buffer));
        TGoodss[i].setYear(rand() % 7 + 2005);*/
        TGoodss[i].set();
        std::cout << TGoodss[i];
    }
 
 
      // поиск товара по name:
    std::cout<<"Enter name\t";
    char buffer[25];
    std::cin>>buffer;
    std::cout << std::endl << "Searching for TGoods with name " << buffer << std::endl;
 
    std::cout<<TGoodss[1].getName()<<std::endl;
    for (size_t i = 0; i < TGoodssCount; ++i)
    if (strcmp(TGoodss[i].getName(), buffer)==0)
        std::cout << TGoodss[i];
 
 
  // поиск товара по году:
    std::cout<<"Enter year ";
    std::cin>>year;
    std::cout << std::endl << "Searching for TGoods with year " << year << std::endl;
 
    for (size_t i = 0; i < TGoodssCount; ++i)
    if (TGoodss[i].getYear() == year)
        std::cout << TGoodss[i];
 
    delete [] TGoodss;
    return 0;
}


OstapBender, буду изучать твои ссылки, но уже не сегодня) Спасибо)
Андрей Валерьев
14 / 14 / 4
Регистрация: 16.01.2016
Сообщений: 55
Завершенные тесты: 2
29.03.2016, 20:10     Создание Массива Объектов класса #7
Цитата Сообщение от GBIT Посмотреть сообщение
std::cout << TGoodss[i];
что то я не понял, что выведет эта строка?
это же один из объектов массива, который содержит два поля( год и имя). И на название метода не похоже.
объясните кто понял)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 13:50     Создание Массива Объектов класса
Еще ссылки по теме:

C++ Создание объектов класса пользователем
C++ Создание массива объектов класса
C++ Создание объектов класса
C++ Создание массива объектов класса через список инициализации в конструкторе композита
Создание класса абстрактных объектов C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
30.03.2016, 13:50     Создание Массива Объектов класса #8
Там есть опреатор
C++
1
2
3
4
    friend std::ostream &operator<<(std::ostream &stream, const TGoods &TGoods)
    {
        return stream << "Name: " << TGoods.getName() << std::endl << "Year: " << TGoods.getYear() << std::endl;
    }
Yandex
Объявления
30.03.2016, 13:50     Создание Массива Объектов класса
Ответ Создать тему
Опции темы

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