Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85

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

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

Студворк — интернет-сервис помощи студентам
Есть класс 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2014, 02:08
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 минуту
я бы код кинул, но смогу это сделать не раньше обеда
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
31.07.2014, 05:39
Цитата Сообщение от Winorun Посмотреть сообщение
В класе масив указателей на свои обьекты ,
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
но что то мне подсказывает что от такой оптимизации только хуже будет
например как узнать что такой объект существует?
по какому критерию? только по содержимому строки ? или какой то идентификатор?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:39
Цитата Сообщение от Winorun Посмотреть сообщение
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
Попытка как будет выглядеть?
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:42
alsav22, тебе ValeryS, подробно и обстоятельно расписал
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
31.07.2014, 05:44
Цитата Сообщение от Winorun Посмотреть сообщение
alsav22, тебе ValeryS, подробно и обстоятельно расписал
что я расписал
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:46
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:46
Цитата Сообщение от Winorun Посмотреть сообщение
тебе ValeryS, подробно и обстоятельно расписал
Я у тебя спросил.
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Чтобы это сделать уже должен быть создан новый объект, иначе, что сравнивать? А ТС нужно:
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы вместо создания нового объекта Word передавался уже созданный
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:47
Ты меня тролишь чтоЛИ
0
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
31.07.2014, 05:59
Лучший ответ Сообщение было отмечено QGuest как решение

Решение

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

Как я понял, вам вполне подойдёт строка со счётчиком ссылок. Пример реализации описан у Страуструпа (примерно глава 7, пункт 6 во втором издании и далее).
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
31.07.2014, 06:11
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:24
Цитата Сообщение от ValeryS Посмотреть сообщение
A* aa=/*здесь сравниваем с уже созданными если есть вернем указатель, если нет то NULL */
С уже созданными, ЧТО сравниваем?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
31.07.2014, 06:34
Цитата Сообщение от alsav22 Посмотреть сообщение
С уже созданными, ЧТО сравниваем?
а я, знаю???
аргументы которые передаются в конструктор, строка наверное
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:46
Цитата Сообщение от ValeryS Посмотреть сообщение
аргументы которые передаются в конструктор, строка наверное
Ну, так не объект же:
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Метод A::new() где будет вызываться?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
31.07.2014, 07:23
Цитата Сообщение от 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
31.07.2014, 08:36

Не по теме:

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

0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 10:48
Как и обещал выкладываю код (Необходимо добавить деструктор). Через 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2014, 10:48

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru