8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
1

Передача существующего объекта вместо создания нового

31.07.2014, 02:08. Показов 1818. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс Word. Он неизменяемый: все методы - константные.
Учитывая это я пытаюсь создать класс таким образом чтобы вместо создания нового объекта Word передавался уже созданный и сохраненный объект с такими-же параметрами. Такой способ, к примеру, используется в Java с классом String (String pool in Java).

Пример кода, что я имею в виду.
C++
1
2
3
Word word1 = "some";
Word word2 = "some";
cout << (&word1 == &word2); //правда. Один и тот-же обьект
Вот класс (его фрагмент) Word:
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
class Word {
private:
    const string& data;
    
    Word(const string& data) : data(data) {}
 
    vector<Word> pool;
 
public:
 
    Word& operator=(const string& data) {
        for (int i = 0; i < pool.size(); i++) {
            if (pool[i].data == data) return pool[i];
        }
 
        Word result(data);
        pool.push_back(result);
        return result;
    }
 
    operator const string&() const {
        return data;
    }
};
 
void main() {
    Word word = "some";
    cout << word;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2014, 02:08
Ответы с готовыми решениями:

Добавление нового и/или обновление существующего свойства объекта
function updateOne(db, collection, _id, service, phase, status) { let query = {_id:...

Перезаполнить элемент вместо создания нового
В модуле на CMS Joomla есть код загрузки товаров из файла .cvs. Так вот этот код создает новые...

Перегрузка оператора без создания нового объекта
Если вкратце то вопросы звучат так: Можно ли на практике делать перегрузку оператора без создания...

Создание нового окна существующего класса
Здравствуйте. Пытаюсь создать новое окно существующего класса MainWindow. В хедере написал ...

39
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 05:29 21
Author24 — интернет-сервис помощи студентам
попробуем подойти по другому
отвлечемся от программирования
вот есть класс человек, описание его сущностей
и есть объект Winorun,
и с ним нужно работать
очень просто во все справочники забиваем этот объект, выдаем ему паспорт
но как создать еще один объект Winorun
причем он должен полностью повторять первый, т.е создать клон
Но он должен и занимать тоже время и пространство что и первый
противоречий не видишь?
0
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
31.07.2014, 05:31 22
как ты из конструктора вернёшь ссылку?
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:32 23
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
0
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
31.07.2014, 05:33 24
Winorun, как ты из конструктора вернёшь ссылку?
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:37 25
Либо я плохо обьесняю либо вы не понимаете.

Добавлено через 1 минуту
я бы код кинул, но смогу это сделать не раньше обеда
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 05:39 26
Цитата Сообщение от Winorun Посмотреть сообщение
В класе масив указателей на свои обьекты ,
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
но что то мне подсказывает что от такой оптимизации только хуже будет
например как узнать что такой объект существует?
по какому критерию? только по содержимому строки ? или какой то идентификатор?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:39 27
Цитата Сообщение от Winorun Посмотреть сообщение
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
Попытка как будет выглядеть?
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:42 28
alsav22, тебе ValeryS, подробно и обстоятельно расписал
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 05:44 29
Цитата Сообщение от Winorun Посмотреть сообщение
alsav22, тебе ValeryS, подробно и обстоятельно расписал
что я расписал
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:46 30
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:46 31
Цитата Сообщение от Winorun Посмотреть сообщение
тебе ValeryS, подробно и обстоятельно расписал
Я у тебя спросил.
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Чтобы это сделать уже должен быть создан новый объект, иначе, что сравнивать? А ТС нужно:
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы вместо создания нового объекта Word передавался уже созданный
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:47 32
Ты меня тролишь чтоЛИ
0
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
31.07.2014, 05:59 33
Лучший ответ Сообщение было отмечено QGuest как решение

Решение

QGuest, вам тут советуют что-то не то. Или вы не понимаете, чего хотите . Если вы хотите класс строк как в Джаве: неизменяемые, и чтобы код
Цитата Сообщение от QGuest Посмотреть сообщение
C++
1
2
3
Word word1 = "some";
Word word2 = "some";
cout << (&word1 == &word2); //правда. Один и тот-же обьект
работал, то это одно (так и назовите тему - хочу строки как в Джава. Кстати, будет хорошее сравнение Джавы и плюсов). Однако даже Джава может вам гарантировать идентичность строк только в пределе одного class-файла (знатоки Java, подправьте, если я не прав). Если вам просто кажется, что так будет быстрее - это другое (скорее всего нет, не будет - как минимум время будет уходить на поиск строки в глобальном пуле объектов. И при миллионе строк создание новой пустой строки будет занимать кучу времени. Оно вам надо?). Подумайте, как вся эта радость будет работать в многопоточной среде (ещё одни расходы на отслеживание одинаковости строк в разных потоках).

Как я понял, вам вполне подойдёт строка со счётчиком ссылок. Пример реализации описан у Страуструпа (примерно глава 7, пункт 6 во втором издании и далее).
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 06:11 34
Цитата Сообщение от alsav22 Посмотреть сообщение
Чтобы это сделать уже должен быть создан новый объект,
не-е-ет
именно проверяем, если нет создаем
я этим давно не занимался, да и мысль только сейчас пришла не сформировалась полностью, по этому распишу коряво полу Си полу псевдо код

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
class A
{
private:
static List lst; // список уже существующих объектов
int qual;  // количество объектов
A(arg); // конструктор обязательно защищенный чтобы создать можно было только через new
public:
 A* new(/*здесь не знаю какие аргументы*/);
~A();
 
 
}
.........
A* A::new()
{
A* aa=/*здесь сравниваем с уже созданными если есть вернем указатель, если нет то NULL */
if(aa)// объект существует?
{
 aa->qual++;   // Да. добавим количество объектов
return aa;   // и вернем на него указатель
}
// объект не существует, создаем
aa=/*здесь выделяем память и вызываем конструктор */ 
A::lst.add(aa);// добавим объект в список
aa->qual=1;// количество один
return aa;  // вернем указатель на только что созданный объект
 
}
 
A::~A()
{
qual--; // уменьшаем количество
if(qual==0) // если равно 0, т.е больше таких объектов, ссылок на него не существует 
 delete this; // удаляем
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:24 35
Цитата Сообщение от ValeryS Посмотреть сообщение
A* aa=/*здесь сравниваем с уже созданными если есть вернем указатель, если нет то NULL */
С уже созданными, ЧТО сравниваем?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 06:34 36
Цитата Сообщение от alsav22 Посмотреть сообщение
С уже созданными, ЧТО сравниваем?
а я, знаю???
аргументы которые передаются в конструктор, строка наверное
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:46 37
Цитата Сообщение от ValeryS Посмотреть сообщение
аргументы которые передаются в конструктор, строка наверное
Ну, так не объект же:
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Метод A::new() где будет вызываться?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
31.07.2014, 07:23 38
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну, так не объект же:
разумеется нет
проверка типа такой
C++
1
2
if(arg==aa->var)
 return aa;
Цитата Сообщение от alsav22 Посмотреть сообщение
Метод A::new() где будет вызываться?
ну типа так
C++
1
2
A* aa=new A(1);
A* bb=new A(1);
и указатели aa и bb должны указывать на один объект
alsav22, ты меня так спрашиваешь как будто я уже решение предложил
А я предложил только идею
задачка интересная но сейчас совершенно нет времени
через несколько дней, если раньше не решат, попробую реализовать

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
правильней сказать
проверить есть ли объект с таким содержимым
1
alsav22
31.07.2014, 08:36
  #39

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
ты меня так спрашиваешь как будто я уже решение предложил
Умолкаю.:)

0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 10:48 40
Как и обещал выкладываю код (Необходимо добавить деструктор). Через new сильно геморойно.
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
#include <stdio.h>
#include <map>
using namespace std;
 
typedef int UserType;
 
class Word {
    UserType data;
    unsigned col;
 
    static map<UserType, Word* > objects;
    Word(UserType);
public:
    static Word *add(UserType);
};
 
map<UserType, Word* > Word::objects;
 
Word *Word::add (UserType id){
    if(Word::objects.count(id)){
        objects[id]->col++;
        return objects[id];
    }
    return new Word(id);
    //objects[id]=A;
}
 
Word::Word(UserType id){
    data=id;
    col=0;
    objects[id]=this;
}
 
 
int main()
{
    Word *A = Word::add(1);
    Word *B = Word::add(2);
    Word *C = Word::add(2);
    printf("%p!=%p==%p\n",A,B,C);
}
1
31.07.2014, 10:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2014, 10:48
Помогаю со студенческими работами здесь

Создание нового компонента на основе существующего (наследование);
Ребята, Вы моя последняя надежда! Осталось последнее задание в курсовой! Все уже зделал, но вот это...

Создание нового tabsheet с копированием элементов существующего
Яндекс с Гуглом не помогли:( Eсть pagecontrol, в нем три tabsheet'a, которые назовем базовыми (A,...

Настройка нового домена на папку существующего сайта
У нас было 2 сайта на разных хостингах. Теперь их решено объединить в один. Т.е. сейчас сайт1.ру...

Ошибка при создании нового проекта/открытии существующего
привет всем переустановил delphi 2010 не могу создать новый проект или открыть проект возникает...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru