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

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

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

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

05.10.2011, 00:37. Просмотров 18824. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание Массива Объектов класса (C++):

Создание массива объектов класса - C++
Создание массива объектов класса. E2451 Undefined symbol 'myZKH' По-разному уже пробовал-безуспешно. /* Создание...

Создание массива объектов класса - C++
Здравствуйте Подскажите пожалуйста как правилььно создать массив объектов класса, что бы не создавать промежуточный объект класса &quot;Rtd&quot;: ...

Создание массива объектов класса - C++
Доброго времени суток! Хотела бы разобраться с вашей помощью в чем-таки состоит моя ошибка. //Создаю класс class TaleGreen { ...

Создание двумерного массива объектов класса Cell - C++
начал изучать ООП, и возник вопрос с разбором программы: #define EMPTY 0x00 typedef char CellType; typedef int...

Создание массива объектов класса через список инициализации в конструкторе композита - 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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
583 / 521 / 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];
что то я не понял, что выведет эта строка?
это же один из объектов массива, который содержит два поля( год и имя). И на название метода не похоже.
объясните кто понял)
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 13:50
Привет! Вот еще темы с ответами:

Создание объектов класса - C++
class A{ A(string name){ } } int main(){ } Есть класс с конструктуром, я понимаю что чтобы создать новый объект...

Создание/удаление объектов класса - C++
Имеется следующий код: cow.h #ifndef COW_H #define COW_H class Cow { private: char name; char * hobby;

Создание объектов класса пользователем - C++
К примеру простой класс: class Test { private: int year; public: void SetValue(int yr) { year = yr; ...

Создание класса абстрактных объектов - C++
Добрый день/утро/вечер. Возник вопрос,скорее теоретического характера. Есть задание реализовать классы вектор и матрица абстрактных...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2016, 13:50
Ответ Создать тему
Опции темы

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