Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
sdumal
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
1

Задача на классы и статические указатели

04.12.2014, 00:05. Просмотров 1037. Ответов 9
Метки нет (Все метки)

Условие задачи: в любой момент времени можно получить последнего из могикан (объект класса), без использования отдельного экземпляра. Нужно хранить указатель, возвращать ссылку. Есть статическая переменная - указатель последнего созданного объекта. Для каждого объекта есть указатель на себя и предыдущий объект. (Хотя наверное глупо хранить указатель на себя - можно к нему обращаться через this). Не пойму как в деструкторе, при удалении из середины объекта, можно обратится к следующему объекту, что бы связать его с предыдущим?
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
class Mohican {
    public:
        static int* last;
        int* current;
        int* prev;
        int number;
 
        Mohican(int number) {
            this->number = number;
            this->prev = last;
            last = &this->number;
            this->current = last;
        }
 
        ~Mohican() {
            if ( this->current == last ) {
                if ( this->prev == NULL) {
                    last == NULL;
                } else {
                    last = this->prev;
                }
            } else {
                
            }
        }
};
 
int* Mohican::last = NULL;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2014, 00:05
Ответы с готовыми решениями:

Классы, статические элементы
Помогите разобрать, что делает данный кусок программы. Желательно построчно -...

Классы (статические члены и конструктор копирования)
Добрый вечер! Написал программку, все нормально работает, но есть два нюанса:...

Указатели на Классы
class B { public: int x; B() { // Конструктор по умолчанию x =...

Классы и указатели
Добрый день, у меня такой вопрос. Вот есть две идентичные записи. Client *...

Классы и указатели
Пишет:"Отсутствуют экземпляры конструктора "Pet::Pet", соответствующие списку...

9
Cookie Monster
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 71
04.12.2014, 07:42 2
static Mohican* last;
Mohican* current;
Mohican* prev;
int number;
Указатели скорее всего должны быть на объекты класса а не на переменную объекта
При помощи статической переменной класса надо в деструкторе искать тот объект у которого в переменной prev хранится адрес уничтожаемого объекта (this) как только нашли просто в найденном объекте необходимо перезаписать значение в переменной prev на значение переменной prev у удаляемого объекта
0
ValeryS
Модератор
7263 / 5517 / 692
Регистрация: 14.02.2011
Сообщений: 18,681
04.12.2014, 08:13 3
Цитата Сообщение от sdumal Посмотреть сообщение
last = &this->number;
что это за конструкция?
Цитата Сообщение от sdumal Посмотреть сообщение
Для каждого объекта есть указатель на себя и предыдущий объект
где???
Цитата Сообщение от sdumal Посмотреть сообщение
C++
1
2
3
4
static int* last;
        int* current;
        int* prev;
        int number

Цитата Сообщение от sdumal Посмотреть сообщение
Хотя наверное глупо хранить указатель на себя - можно к нему обращаться через this
вся фишка в том, что из всех объектов можно узнать последний созданный
static int* last будет для всех одинаков

C++
1
2
3
Mohican A;
Mohican B;
Mohican C;
B.last==C.last==A.last и все это равно C
0
sdumal
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
04.12.2014, 21:57  [ТС] 4
1. Действительно логичней использовать указатели на объекты класса, спасибо. Думал правильно, писал наоборот.
2. Не пойму механизм поиска объекта в деструкторе. Может можно обратится к этому объекту напрямую? Тогда нужно хранить где то ссылку на него.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.12.2014, 22:13 5
Цитата Сообщение от sdumal Посмотреть сообщение
Не пойму как в деструкторе, при удалении из середины объекта, можно обратится к следующему объекту, что бы связать его с предыдущим?
Попробуй реализовать связный список. Смысл тот же, но задача более близка к реальности.
В твоем случае можно пойти с конца (с последнего магикянина), когда дойдешь до this, будешь знать, кто идет за ним.
0
ValeryS
Модератор
7263 / 5517 / 692
Регистрация: 14.02.2011
Сообщений: 18,681
04.12.2014, 22:38 6
Лучший ответ Сообщение было отмечено sdumal как решение

Решение

Цитата Сообщение от sdumal Посмотреть сообщение
Не пойму механизм поиска объекта в деструкторе. Может можно обратится к этому объекту напрямую? Тогда нужно хранить где то ссылку на него.
к этому это к какому?
сам объект это this
вот пример , надуманный из головы, чтото типа списка
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
class A
{
static A* last;
A* next;
A* prev;
public:
A()
 {
  next=NULL;
  prev=last;
  last=this;
  if(prev!=NULL)
   prev->next=this;
 
 }
~A()
{
 if(last!=this) // удаляемый элемент не последний
 {
   next->prev=prev; // следующий элемент указывает на предыдущий
   prev->next=next; // предыдущий на следующий
  // выбрасываем элемент из списка
 }
 else // последний
  {
   last=prev;  // последний созданный равен предудущему
  if(prev!=NULL)
   prev->next=NULL;//предыдущий становится последним элементом
  }
 
 }
 
}
Добавлено через 4 минуты
можно добавить еще указатель на голову
что то типа
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
class A
{
static A* last;
static A* head;
A* next;
A* prev;
public:
A()
 {
  if(head==NULL)
    head=this
  next=NULL;
  prev=last;
  last=this;
  if(prev!=NULL)
   prev->next=this;
 
 }
~A()
{
 if(last!=this) // удаляемый элемент не последний
 {
   next->prev=prev; // следующий элемент указывает на предыдущий
   prev->next=next; // предыдущий на следующий
  // выбрасываем элемент из списка
 }
 else // последний
  {
   last=prev;  // последний созданный равен предудущему
  if(prev!=NULL)
   prev->next=NULL;//предыдущий становится последним элементом
  }
}
}
0
sdumal
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
04.12.2014, 23:01  [ТС] 7
Получилось как-то так:
#include <iostream>

class Mohican {
public:
static Mohican* Last;
Mohican* Next;
Mohican* Prev;
int number;

Mohican(int number) {
Prev = Last;
Last = this;
if ( Prev != NULL ) {
Prev->Next = this;
}
}

~Mohican() {
if ( this == Last ) {
if ( Prev == NULL ) {
Last = NULL;
} else {
Last = Prev;
}
} else if ( Prev == NULL ) {
Next->Prev = NULL;
} else {
Prev->Next = this->Next;
Next->Prev = Prev;
}
}
};

Mohican* Mohican::Last = NULL;
0
ValeryS
Модератор
7263 / 5517 / 692
Регистрация: 14.02.2011
Сообщений: 18,681
04.12.2014, 23:04 8
sdumal,
теги ставь
читать неудобно
набираешь свой листинг, потом выделяешь его мышкой. и жмешь кнопочку "С++" на шапке быстрого ответа
0
sdumal
0 / 0 / 0
Регистрация: 03.12.2014
Сообщений: 6
04.12.2014, 23:07  [ТС] 9
ValeryS, спасибо за помощь.

Добавлено через 2 минуты
Перелистал много источников в интернете, все достаточно поверхностно этот вопрос освещают. В итоге без помощи тяжело решать даже такие простые задачи. Я так понимаю, что бы сходу их решать, нужен опыт а не количество прочтенных книг?
0
ValeryS
Модератор
7263 / 5517 / 692
Регистрация: 14.02.2011
Сообщений: 18,681
04.12.2014, 23:16 10
Цитата Сообщение от sdumal Посмотреть сообщение
Я так понимаю, что бы сходу их решать, нужен опыт а не количество прочтенных книг?
и то и другое
"Теория без практики мертва,
А вечно зелено лишь древо жизни"(с) "Фаус" Гете
и изучать нужно не только язык, а так скажем, и фундаментальные науки, алгоритмы, булеву алгебру, двоичный счет.....
например чтобы понять что такое список, удобно на бумажке нарисовать квадратики соединить их стрелочками
потом вставить элемент в список, удалить, перерисовывая стрелочки
тогда будет понятно что это за указатели, с чем их едят

Не по теме:

Цитата Сообщение от sdumal Посмотреть сообщение
спасибо за помощь
А для этого тоже есть кнопочка, внизу у каждого сообщения:)

0
04.12.2014, 23:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2014, 23:16

Указатели на классы
class A {}; class B : public A {}; int main() { A *ob1=new B; B...

Перечисление,указатели, классы
Здравствуйте, можете скинуть или написать простые задачи на тему...

Указатели на производные классы
Подскажите, как создать массив типа &quot;указатель на базовый класс&quot;, который будет...


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

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

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