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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Jleloush
 Аватар для Jleloush
1 / 1 / 1
Регистрация: 16.01.2010
Сообщений: 26
24.07.2011, 17:27     номер объекта #1
Недавно начал изучать классы , и возник такой вопрос:
Как создать класс с двумя полями, где одно поле хранит порядковый номер, а второе общее кол-во объектов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2011, 17:27     номер объекта
Посмотрите здесь:

Как правильно вызывать функцию объекта из другой функции того же объекта? C++
C++ Требуется ли при удалении объекта посредством delete указывать тип объекта?
При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
C++ Дан номер года, определить соответствующий ему номер столетия
C++ Необходимо найти номер строки и номер столбца, в которых находится наименьший элемент.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
24.07.2011, 17:35     номер объекта #2
Учитесь задавать вопросы корректно.

Вам нужно, что бы каждый вновь родившийся объект имел свой уникальный номер, и знал количество уже родившихся объектов?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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;
}
Jleloush
 Аватар для Jleloush
1 / 1 / 1
Регистрация: 16.01.2010
Сообщений: 26
24.07.2011, 17:40  [ТС]     номер объекта #4
при выводе объекта писался его личный номер.
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;
}
Конечно, здесь номера могут повторяться у разных объектов.

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

Умный сразу глянет в сторону статиков. Глупому расжовывать не хочется.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.07.2011, 17:51     номер объекта #7
Цитата Сообщение от Bers Посмотреть сообщение
num=count;
гениально, и при уничтожении объекта вскоре опять появится объект с таким же номером, или это уже какая-то другая уникальность?
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
24.07.2011, 17:52     номер объекта #8
Kastaneda, а если мы удалим предпоследний элемент и создадим новый, то его номер совпадет с последним)

я бы организовал стек свободных номеров и к нему прикрутил бы счетчик элементов. вроде так будет элегантнее, хотя и вне класса объектов.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.07.2011, 17:52     номер объекта #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
где одно поле хранит порядковый номер
это и будет порядковый номер в самом прямом смысле
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
24.07.2011, 17:58     номер объекта #10
Цитата Сообщение от Paporotnik Посмотреть сообщение
Kastaneda, а если мы удалим предпоследний элемент и создадим новый, то его номер совпадет с последним)
Ну да, тут не подумал)

Цитата Сообщение от alex_x_x Посмотреть сообщение
это и будет порядковый номер в самом прямом смысле
Да, но если мы имеем 10 объектов, и второй захочет получить свой порядковый номер, то он получит 10, а не 2.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.07.2011, 17:59     номер объекта #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да, но если мы имеем 10 объектов, и второй захочет получить свой порядковый номер
я не понимаю такого языка О_о
пример пожалуйста
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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;
}
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
24.07.2011, 18:07     номер объекта #13
alex_x_x, а зачем делать порядковый номер static, ведь он же уникальный для каждого обьекта...
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.07.2011, 18:08     номер объекта #14
а бже, ну да, нужно отдельную переменную заводить

Добавлено через 33 секунды
Net_Wanderer, чтобы выбирать следующий
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
24.07.2011, 18:12     номер объекта #15
Цитата Сообщение от Jleloush Посмотреть сообщение
где одно поле хранит порядковый номер, а второе общее кол-во объектов.
Я не понял на хрена это нужно
но по моему это обыкновенный динамический массив
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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?
}
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
24.07.2011, 18:36     номер объекта #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
гениально, и при уничтожении объекта вскоре опять появится объект с таким же номером
для неповторяемости номера можно присваивать ему значения времени например
но обращаться к объектам все равно будем по именам (это и есть идентификатор) чаще всего не повторяемый (по крайней мере в одном блоке)
зачем это???

Добавлено через 4 минуты
а еще в ID можно писать адрес объекта в памяти
а можно не писать а просто выводить
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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/5ba7e8...aa9dc154fa3b5f

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

Цитата Сообщение от ValeryS Посмотреть сообщение
но обращаться к объектам все равно будем по именам (это и есть идентификатор)
а так же все объекты различаются по адресу в памяти
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 19:21     номер объекта
Еще ссылки по теме:

C++ Найти номер строки и номер столбца, в котором находится минимальный элемент матрицы
C++ Выяснить номер квартала и номер полугодия по введенному номеру месяца
Создание объекта в функции и возврат объекта из нее C++

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

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


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

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

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

Вооружившись оной он и сам сможет понять, как сделать лучше.
Или пусть задаёт конкретный ясный вопрос. Я не телепат
Yandex
Объявления
24.07.2011, 19:21     номер объекта
Ответ Создать тему
Опции темы

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