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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Класс, знающий все свои экземляры - C++

19.04.2013, 20:40. Просмотров 265. Ответов 5
Метки нет (Все метки)

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
class A
{
 protected:
  static A **ptr;
  static size_t ptrcount;
 public:
 A ()
 {
  A **s;
  A **t;
  A **p=new A*[ptrcount+1];
  p[ptrcount]=this;
  if (this->ptr)
  {
   for (t=p+ptrcount-1, s=ptr+ptrcount-1; s>=ptr; --s, --t)
   {
    *t=*s;
   }
   delete [] ptr;
  }
  ptr=p;
  ++ptrcount;
 }
 A (A &a)
 {
  A **s;
  A **t;
  A **p=new A*[ptrcount+1];
  p[ptrcount]=this;
  if (this->ptr)
  {
   for (t=p+ptrcount-1, s=ptr+ptrcount-1; s>=ptr; --s, --t)
   {
    *t=*s;
   }
   delete [] ptr;
  }
  ptr=p;
  ++ptrcount;
 }
 ~A ()
 {
  A **s;
  A **t;
  A **p=new A*[ptrcount+1];
  if (ptrcount>1)
  {
   for (t=this->ptr+ptrcount-1; t>=this->ptr; --t)
   {
    if (*t==this)
    {
    *t=ptr[ptrcount-1];
    }    
   }
   for (t=p+ptrcount-2, s=ptr+ptrcount-2; s>=ptr; --s, --t)
   {
    *t=*s;
   }
   delete [] ptr;
   ptr=p;
   --ptrcount;
  }
  else
  {
   delete [] ptr;
   ptr=null_ptr;
   ptrcount=0;
  }
 }
};
static A *ptr=NULL;
static size_t ptrcount=0;
Есть замечания?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 20:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс, знающий все свои экземляры (C++):

Класс, знающий все свои экземпляры - C++
Некий класс, пусть его зовут A. В разных частях программы валяются строки A a;, A b;, A *p=new A;, static A c;, static A *d=new A; и тому...

Почему перезаписываются предыдущие экземляры - C++
Проблема в том что всем предыдущим полям присваивается значение последнего(надеюсь что ясно выразился) Вот код: #include...

Удалить все права доступа до папки Windows и поставить свои - C++
Здравствуйте, у меня задача на данный момент создать папку с правами пользователя System, но создается папка с правами для всех. Есть ли...

Шаблонный класс очереди. Выводит сначала все индексы, потом все элементы - C++
#include <iostream> #include <conio.h> using namespace std; const int SIZE=100; template<class X> class queue{ X q; ...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template <class T> class matrix { friend class diagonal; ...

Аналог realloc, знающий классы и вызывающий конструкторы/деструкторы - C++
Можно ли сделать такой шаблон? class A { }; class B { }; A *a; B *b; a=MyReAlloc(a, 1024); // Размер куска памяти по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.04.2013, 20:45 #2
taras atavin, Угу. Во первых вместо указателя на указатель лучше юзать вектор указателей.
Во вторых

C++
1
2
static A *ptr=NULL;
static size_t ptrcount=0;
Должно выглядеть как

C++
1
2
A* A::ptr = NULL;
size_t A::ptrcount = 0;
Ну и в заключение: совершенно ненужный изврат же ведь.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 20:47  [ТС] #3
Зачем это нужно, вопрос отдельный, здесь разбираем реализацию.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.04.2013, 21:08 #4
taras atavin, Класс знающий о своих инстансах - само по себе бредово. Вот класс менеджер знающих об инстансах конкретного класса было бы вполне себе ок.

Добавлено через 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
#include <vector>
#include <iostream>
#include <string>
 
class A
{
public:
    A(const std::string& n) : name(n)
    {
        push_instance();
    }
    A(const A& rhs) : name(rhs.name)
    {
        push_instance();
    }
    ~A()
    {
        std::cout << "Pop: " << name << std::endl;
        instances.pop_back();
    }
private:
    void push_instance()
    {
        std::cout << "Push: " << name << std::endl;
        instances.push_back(this);
    }
    std::string name;
    static std::vector<A*> instances;
};
 
std::vector<A*> A::instances;
 
int main()
{
    A a("1");
    A b("2");
}
А вот так будет несколько правильнее.

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
#include <vector>
#include <iostream>
#include <string>
 
template<typename T>
class InstanceCounter
{
public:
    static InstanceCounter<T>& instance()
    {
        static InstanceCounter<T> inst;
        return inst;
    }
    void push_instance(const T* const ptr)
    {
        instances.push_back(ptr);
    }
    void pop_instance()
    {
        instances.pop_back();
    }
    int instances_size()
    {
        return instances.size();
    }
private:
    InstanceCounter(const InstanceCounter&);
    InstanceCounter& operator = (const InstanceCounter&);
    InstanceCounter() {}
    std::vector<const T*> instances;
};
 
class A
{
public:
    A(const std::string& n) : name(n)
    {
        push_instance();
    }
    A(const A& rhs) : name(rhs.name)
    {
        push_instance();
    }
    ~A()
    {
        std::cout << "Pop: " << name << std::endl;
        InstanceCounter<A>::instance().pop_instance();
    }
private:
    void push_instance()
    {
        std::cout << "Push: " << name << std::endl;
        InstanceCounter<A>::instance().push_instance(this);
    }
    std::string name;
};
 
int main()
{
    InstanceCounter<A>& cnt = InstanceCounter<A>::instance();
    std::cout << cnt.instances_size() << std::endl;
    {
    A a("1");
    A b("2");
    std::cout << cnt.instances_size() << std::endl;
    }
    std::cout << cnt.instances_size() << std::endl;
}
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.04.2013, 21:22 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
А вот так будет несколько правильнее.
Но не совсем. Этот класс полагается на строгий LIFO порядок создания-уничтожения объектов класса A, и при нарушении этого порядка (что, в общем-то, дело совсем нехитрое) часть указателей начинает показывать на удалённые объекты, а указатели на ещё не уничтоженные объекты теряются.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.04.2013, 22:06 #6
Nick Alte, Согласен. Тут логичнее через find действовать ну и закрыть изменения извне, открыв изменения только в нужном классе. Это просто пример.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 22:06
Привет! Вот еще темы с ответами:

Найти все числа, не превосходящие заданного N (10<N<10000), которые делятся на все свои цифры. - Pascal
как решить следующую задачу? Задача Д1. Найти все числа, не превосходящие заданного N (10&lt;N&lt;10000), которые делятся на все свои...

Получить все числа, не превышающие заданного числа n, которые делятся без остатка на все свои цифры - Pascal
получить все числа не превышающие заданного числа n, которые делятся без остатка на все свои цифры.

QListView has no member все свои функции - C++ Qt
собственно пишу сейчас чат, словил вот такие ошибки, гиде я дурак? ругетсо не только на count но и на addItem, item, takeItem и...

Все дружно проверяем свои знания!!!:-) - Delphi
1. (60c.) Какое из имен используется для задания текста процедур, функций, методов? (один ответ) 1) LABEL 2) INTERFACE 3)...


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

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

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