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

Сортировка для контейнера с указателями - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 12:29     Сортировка для контейнера с указателями #1
Понадобилось сделать контейнер указателей, но встала проблема сортировки и типа контейнера :
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
#include <set>
using std::set;
struct MYSTRUCT
{
    int num;
    char* name;
    MYSTRUCT() : num(NULL) 
    {
        name = new char[20];
        *name = num;
        name[1] = '\0';
    }
    MYSTRUCT(int x) : num(x)
    {
        name = new char[20];
        name[1] = '\0';
        *name = num;
    }
    MYSTRUCT(const MYSTRUCT& ms) : num(ms.num)
    {
        name = new char[20];
        strcpy_s(name, 19, ms.name);
    }
 
    bool operator<(const MYSTRUCT &ms) const
    {
        if (num < ms.num)
            return true;
        return false;
    }
 
    bool operator<(const MYSTRUCT* ms) const
    {
        if (num < ms->num)
            return true;
        return false;
    }
 
    ~MYSTRUCT()
    {
        num = NULL;
        delete name;
    }
 
};
 
void main()
{
    set <MYSTRUCT*> mySet;
    MYSTRUCT a(3), b(5), c(3);
    mySet.insert(&a);
    mySet.insert(&b);
    mySet.insert(&c);
    mySet.clear();
    
    int crapForTimeWasting = 0;
}
После выполнение в mySet лежит 3 объекта.
Как перегрузить сравнение для указателей, а так же как намекнуть set, что указатели равны, и он не multiset?

Не по теме:

p.s Нормально ли пренебрегать инкапсуляций, если класс, имеющий контейнер объектов/указателей на объекты другого класса - приватит этот контейнер, а класс, находящийся в этом контейнере - публичный, но при этом нигде больше не используется и не имеет статический методов? Что-то типа :

C++
1
2
3
4
5
6
7
8
9
10
11
12
class B
{
public :
*a lot of information without Set/Get methods*
};
class A
{
private :
vector<B*> field;
public :
void AddObjectIntoField(B*);
};

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 18:53  [ТС]     Сортировка для контейнера с указателями #21
Выходит, что сделать класс для "двойной" перегрузки нельзя? Ведь один класс будет 100% определен раньше другого. А засунуть сравнение после обоих классов не поможет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 18:55     Сортировка для контейнера с указателями #22
что такое двойная перегрузка? не путаете ли вы определение с имплементацией?
сперва определения двух классов. потом имплементация методов, в которых собственно идет обращения к мемберам. т.к. определения уже были, то это нормально скомпилируется.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.08.2012, 18:57     Сортировка для контейнера с указателями #23
Перед реализациями функций operator() есть только предварительные объявления классов или же классы уже описаны полностью? Должны быть полностью описаны. Причём для описания самого класса COMPARE достаточно только предварительных определений, но тогда функции всё-равно определять придётся после определений классов ROOM и USER, поскольку в функциях указатели разыменовываются.

Добавлено через 1 минуту

Не по теме:

Долго, что-то, набирал я

nexen
28.08.2012, 19:01  [ТС]
  #24

Не по теме:

DU, oh my god.. А я сейчас вот уже третий час пишу то, что, как оказывается, не будет работать.. Вот теперь я и правда в печали :<
На данный момент выдало 169 ошибок >_<

DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:03     Сортировка для контейнера с указателями #25
ну скорее всего все будет работать, нужно только правильно код организовать. я так и не понял проблему. вопрос топика касался кастомного оператора < для указателей. потом что-то левое пошло. где проблема - непонятно.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 19:13  [ТС]     Сортировка для контейнера с указателями #26
DU, попробую объяснить (а заодно надеюсь на совет - стоит ли прямо сейчас переписывать код, ибо то, что я хочу - невозможно).
Есть 4 класса : server, user, room, compare.
У server есть два поля :
set <USER*, COMPARE>
set <ROOM*, COMPARE>
У user есть поле :
set <ROOM*, COMPARE>
У room есть поле :
set <USER*, COMPARE>

Описывал я так прототипами все 4 класса. Затем подключал хэдер room, user, server, compare (именно в такой последовательности). Вся их реализация в одноименных cpp-файлах.
С точки зрения здоровой логики мне не ясно, как room, ссылается (и использует!) на поля user, определенного после него, но объявленного до него. Ну и с остальными такие же непонятки.

А насчет find и операторов я спрашивал потому, что хотел в классах user и room хранить set<int> - где это были бы ID, а в сервере уже искать запись по ID
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 19:24     Сортировка для контейнера с указателями
Еще ссылки по теме:

Сортировка контейнера list C++
Свой компаратор для контейнера set C++
C++ Использование контейнера set для создания словаря

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:24     Сортировка для контейнера с указателями #27
Вот может такой код прояснит немного ситуацию:
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
///////////////////////////////////////////////////////////////
// Foo.h
class Bar;
class Foo
{
public:
  Bar* bar;
 
  Foo();
};
 
///////////////////////////////////////////////////////////////
//Bar.h
class Foo;
 
class Bar
{
public:
  Foo* foo;
 
  Bar();
};
 
 
///////////////////////////////////////////////////////////////
// Foo.cpp
#include "Foo.h"
#include "Bar.h"
// вот начиная с этой точки и далее классы Foo и Bar определены.
// Поэтому в имплементации можно обращаться к полям
Foo::Foo()
{
  bar = new Bar();
  // это можно. ведь определение класса Bar уже видно за счет нужного инклуда. то, что конструктор Bar заимплеменчен
  // где-то в другом месте - это уже задача линковщика найти это место и в конечный
  // бинарь вставить правильный код.
 
  const bool isNull = bar->foo == 0;
  // Обращение к мемберу bar->foo тоже корректное т.к. определение класса Bar
  // в этом месте видно за счет инклудов в начале файла.
}
 
///////////////////////////////////////////////////////////////
// Bar.cpp
#include "Foo.h"
#include "Bar.h"
// вот начиная с этой точки и далее классы Foo и Bar определены.
// Поэтому в имплементации можно обращаться к полям
Bar::Bar()
{
  foo = new Foo();
  // это можно. ведь определение класса Foo уже видно за счет нужного инклуда. то, что конструктор Foo заимплеменчен
  // где-то в другом месте - это уже задача линковщика найти это место и в конечный
  // бинарь вставить правильный код.
 
  const bool isNull = foo->bar == 0;
  // Обращение к мемберу foo->bar тоже корректное т.к. определение класса Foo
  // в этом месте видно за счет инклудов в начале файла.
}
Yandex
Объявления
28.08.2012, 19:24     Сортировка для контейнера с указателями
Ответ Создать тему
Опции темы

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