Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Jleloush
1 / 1 / 1
Регистрация: 16.01.2010
Сообщений: 26
#1

номер объекта - C++

24.07.2011, 17:27. Просмотров 1469. Ответов 19
Метки нет (Все метки)

Недавно начал изучать классы , и возник такой вопрос:
Как создать класс с двумя полями, где одно поле хранит порядковый номер, а второе общее кол-во объектов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2011, 17:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос номер объекта (C++):

Создать класс, одно из полей которого хранит порядковый номер объекта
Создайте класс, одно из полей которого хранит "порядковый номер" объекта, то...

Требуется ли при удалении объекта посредством delete указывать тип объекта?
например, есть указателиvoid *p1; void *p2; есть VCL-объект TButton, есть...

Как правильно вызывать функцию объекта из другой функции того же объекта?
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на...

Свойство объекта в виде массива char заполняется только для одного объекта
Есть два свойства: одно - string, второе - массив char. Если начать заполнять...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для...

Вывод данных вложенного объекта из другого объекта
Добрый День! Хочу в одном объекте вывести текст который находится во вложенном...

19
Bers
Заблокирован
24.07.2011, 17:35 #2
Учитесь задавать вопросы корректно.

Вам нужно, что бы каждый вновь родившийся объект имел свой уникальный номер, и знал количество уже родившихся объектов?
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 17:39 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A{
public:
  A(){++num; ++count;}
  ~A() {--count;}
private:
  static unsigned num;
  static unsigned count;
};
 
unsigned A::num = 0;
unsigned A::count = 0;
 
int main()
{
  A a;
}
0
Jleloush
1 / 1 / 1
Регистрация: 16.01.2010
Сообщений: 26
24.07.2011, 17:40  [ТС] #4
при выводе объекта писался его личный номер.
0
Bers
Заблокирован
24.07.2011, 17:43 #5
Алекс, порядковый номер для объекта уникален (или нафига вообще может быть нужен?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
public:
  A() { ++count;  num=count; }
  ~A() {--count;}
private:
  unsigned int num;
  static unsigned int count;
};
 
unsigned A::count = 0;
 
int main()
{
  A a;
}
Конечно, здесь номера могут повторяться у разных объектов.

Но поскольку автор сам не в состоянии точно выразить, чего ему надо, сойдёт и так.

Умный сразу глянет в сторону статиков. Глупому расжовывать не хочется.
1
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
24.07.2011, 17:47 #6
alex_x_x, а как же

Цитата Сообщение от Jleloush Посмотреть сообщение
где одно поле хранит порядковый номер
?
Тогда уж так:
C++
1
2
3
4
5
6
7
8
9
class A{
public:
  A(){++count;num=count; }
  ~A() {--count;}
private:
  unsigned num;
  static unsigned count;
};
unsigned A::count = 0;
Добавлено через 35 секунд

Не по теме:

ну вот, опять...



Добавлено через 2 минуты
Цитата Сообщение от Jleloush Посмотреть сообщение
при выводе объекта писался его личный номер.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A{
public:
  A(){++count;num=count; }
  ~A() {--count;}
  friend std::ostream& operator<<(std::ostream& os, A ob){
           return os<<ob.num;
  }
private:
  unsigned num;
  static unsigned count;
};
unsigned A::count = 0;
 
int main()
{
  A a;
  std::cout<<a<<std::endl;
}
1
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 17:51 #7
Цитата Сообщение от Bers Посмотреть сообщение
num=count;
гениально, и при уничтожении объекта вскоре опять появится объект с таким же номером, или это уже какая-то другая уникальность?
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
24.07.2011, 17:52 #8
Kastaneda, а если мы удалим предпоследний элемент и создадим новый, то его номер совпадет с последним)

я бы организовал стек свободных номеров и к нему прикрутил бы счетчик элементов. вроде так будет элегантнее, хотя и вне класса объектов.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 17:52 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
где одно поле хранит порядковый номер
это и будет порядковый номер в самом прямом смысле
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
24.07.2011, 17:58 #10
Цитата Сообщение от Paporotnik Посмотреть сообщение
Kastaneda, а если мы удалим предпоследний элемент и создадим новый, то его номер совпадет с последним)
Ну да, тут не подумал)

Цитата Сообщение от alex_x_x Посмотреть сообщение
это и будет порядковый номер в самом прямом смысле
Да, но если мы имеем 10 объектов, и второй захочет получить свой порядковый номер, то он получит 10, а не 2.
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 17:59 #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да, но если мы имеем 10 объектов, и второй захочет получить свой порядковый номер
я не понимаю такого языка О_о
пример пожалуйста
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
24.07.2011, 18:05 #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
пример пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A{
public:
  A(){++num; ++count;}
  ~A() {--count;}
  unsigned get_num(){return num;}
private:
  static unsigned num;
  static unsigned count;
};
 
unsigned A::num = 0;
unsigned A::count = 0;
 
int main()
{
  A arr[10];
  for(int i=0;i<10;i++)
      std::cout<<"Hello, i am arr["<<i<<"], my number is: "<<arr[i].get_num()<<std::endl;
}
0
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
24.07.2011, 18:07 #13
alex_x_x, а зачем делать порядковый номер static, ведь он же уникальный для каждого обьекта...
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 18:08 #14
а бже, ну да, нужно отдельную переменную заводить

Добавлено через 33 секунды
Net_Wanderer, чтобы выбирать следующий
0
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,228
24.07.2011, 18:12 #15
Цитата Сообщение от Jleloush Посмотреть сообщение
где одно поле хранит порядковый номер, а второе общее кол-во объектов.
Я не понял на хрена это нужно
но по моему это обыкновенный динамический массив
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
24.07.2011, 18:22 #16
Да не, еще одной переменной будет достаточно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A{
public:
  A(){++num; ++count;number=num;}
  ~A() {--count;}
  unsigned get_num(){return number;}
private:
  unsigned number;
  static unsigned num;
  static unsigned count;
};
 
unsigned A::num = 0;
unsigned A::count = 0;
правда тут нужно уточнить, как должен вести себя этот порядковый номер, должен ли меняться порядок при разрушении объекта?
Например:
C++
1
2
3
4
5
6
7
{//какой-то блок кода
A a;//например этот объект имеет порядковый номер 7
}//а разрушается
 
{//еще один блок кода
A b;//вот здесь b должен иметь номер 7 или 8?
}
0
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,228
24.07.2011, 18:36 #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
гениально, и при уничтожении объекта вскоре опять появится объект с таким же номером
для неповторяемости номера можно присваивать ему значения времени например
но обращаться к объектам все равно будем по именам (это и есть идентификатор) чаще всего не повторяемый (по крайней мере в одном блоке)
зачем это???

Добавлено через 4 минуты
а еще в ID можно писать адрес объекта в памяти
а можно не писать а просто выводить
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 18:46 #18
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
#include <vector>
#include <algorithm>
#include <iostream>
 
class A;
 
class Factory
{
public:
  Factory();
  ~Factory();
  A* getA();
  unsigned getCount();
  bool destroyA(A*); 
private: 
  std::vector<A*> m_v;
  unsigned number; 
};
 
class A
{
public:
  unsigned getNum()   const;
  unsigned getCount() const;
  ~A();
  friend class Factory; 
private:
  A(Factory* _factory, unsigned _num);
  
  Factory* m_factory;  
  unsigned num; 
};
 
Factory::Factory() : m_v(), number(0) {}
 
Factory::~Factory()
{
  if( m_v.size() )
  {
    std::cout << "memory leak!" << std::endl;
  }
}
 
A* Factory::getA()
{
  A* a = new A( this, ++number );
  m_v.push_back( a );
  return a; 
}
 
unsigned Factory::getCount()
{
  return m_v.size();
}
 
bool Factory::destroyA(A* a)
{
  std::vector<A*>::iterator it;
  if( m_v.end() != ( it = std::find( m_v.begin(), m_v.end(), a ) ) )
  {
    m_v.erase( it );
    return true; 
  }   
 
  return false;  
}
 
A::A(Factory* _factory, unsigned _num) : m_factory(_factory), 
                                       num( _num )
{
  std::cout << "A{" << num << '}' << std::endl;
}  
 
unsigned A::getNum() const 
{
  return num;
}
   
unsigned A::getCount() const
{
  return m_factory->getCount();
}
 
A::~A()
{
  m_factory->destroyA(this); 
}
 
int main()
{
  Factory fact;
  A* arr[3];
  arr[0] = fact.getA();
  arr[1] = fact.getA();
  std::cout << "count = " << arr[0]->getCount() << std::endl;
  arr[2] = fact.getA();
  delete arr[0];
  std::cout << "count = " << arr[1]->getCount() << ", number = " 
            << arr[1]->getNum() << std::endl;
  delete arr[1];
  
  std::cout << "count = " << arr[2]->getCount() << ", number = " 
            << arr[2]->getNum() << std::endl; 
}
http://liveworkspace.org/code/5ba7e806585142fc70aa9dc154fa3b5f

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
для неповторяемости номера можно присваивать ему значения времени например
но обращаться к объектам все равно будем по именам (это и есть идентификатор) чаще всего не повторяемый (по крайней мере в одном блоке)
зачем это???
откуда я знаю зачем это надо ТС?)
0
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,228
24.07.2011, 18:53 #19
Цитата Сообщение от alex_x_x Посмотреть сообщение
откуда я знаю зачем это надо ТС?)
наверно потому что
Цитата Сообщение от Jleloush Посмотреть сообщение
Недавно начал изучать классы
и не знает что

Цитата Сообщение от ValeryS Посмотреть сообщение
но обращаться к объектам все равно будем по именам (это и есть идентификатор)
а так же все объекты различаются по адресу в памяти
0
Bers
Заблокирован
24.07.2011, 19:21 #20
Цитата Сообщение от alex_x_x Посмотреть сообщение
гениально, и при уничтожении объекта вскоре опять появится объект с таким же номером, или это уже какая-то другая уникальность?
Внимательно читаем комментарий:


Цитата Сообщение от Bers Посмотреть сообщение
Конечно, здесь номера могут повторяться у разных объектов.
Но поскольку автор сам не в состоянии точно выразить, чего ему надо, сойдёт и так.
Умный сразу глянет в сторону статиков. Глупому расжовывать не хочется.
Я хз, что на самом деле нужно ТС. И что он подразумевает под "порядковым номером объекта"

То бишь, я не знаю по какому правилу должен формироваться этот номер. Какие тут могут быть требования, и ограничения. Соотвественно - не нагружаю мозг излишней работой.

ТС привели пример кода, как с помощью статиков, объекты класса могут получать общую для них всех информацию.

Вооружившись оной он и сам сможет понять, как сделать лучше.
Или пусть задаёт конкретный ясный вопрос. Я не телепат
0
24.07.2011, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 19:21
Привет! Вот еще темы с решениями:

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный...

Cout like: перегрузить оператор<< по примеру объекта cout для extern объекта пользовательского типа
Мне нужен extern объект по примеру cout с перегруженным оператором. Я нечто...

Дан номер года, определить соответствующий ему номер столетия
Дан номер некоторого года(целое положительное число). Определить...

Выяснить номер квартала и номер полугодия по введенному номеру месяца
Вводится число k - номер месяца. Выяснить номер квартала и номер полугодия по...


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

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

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