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

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

Войти
Регистрация
Восстановить пароль
 
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
#1

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

31.07.2014, 02:08. Просмотров 809. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 02:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача существующего объекта вместо создания нового (C++):

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

Функция для создания нового файла - C++
Дан текстовый файл с неизвестным количеством вещественных чисел. Написать функцию для создания нового файла, в который нужно записать ...

Конструктор. Создание нового объекта - C++
Всем привет, Пишу программу &quot;Мой сборник CD&quot;. Как можно создавать объекты не вводя их количество в начале программы? Например, если...

Написать функцию для создания нового файла - C++
Дан текстовый файл с неизвестным количеством вещественных чисел. Написать функцию для создания нового файла. В Файл записать числа, у...

Перегрузка оператора + и создание нового объекта на этой основе - C++
Такая проблема. Реализую класс строка. Весь нужный код ниже. Вот так работает: STRING str1(&quot;123&quot;); STRING str2(&quot;ABC&quot;); ...

В чем разница создания объекта? - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; class B {private: int b1,b2; public: B() {cout&lt;&lt;&quot;Constructor B without...

39
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
31.07.2014, 05:15 #16
Цитата Сообщение от QGuest Посмотреть сообщение
В том той дело, что именно существующий экземпляр мне может быть мне и не нужен. Я могу создать новый ТАКОЙ-ЖЕ из существующих данных. Но я бы хотел, чтобы класс Word при попытке создания нового экземпляра подставлял вместо него ТАКОЙ-ЖЕ существующий.
что то я не понял ТАКОЙ-ЖЕ это не ЭТОТ-ЖЕ
следовательно создается другой объект и копируются данные
но судя по всему тебе нужен один объект
тогда такой выход вижу:
сделать объект глобальным
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 480
31.07.2014, 05:17 #17
Цитата Сообщение от QGuest Посмотреть сообщение
это я про this говорил.
Вот именно. Создание объекта - это всегда вызов конструктора, как ты собираешься адрес создаваемого объекта поменять?

И ещё раз
Цитата Сообщение от dalay_lama Посмотреть сообщение
Покажи пример метода, в котором ты хочешь создать объект, но при этом тебе вернули уже созданый
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:19 #18
конструктор с видимостью на все обьекты, а там поиск отсортированного значения. В чем проблема?
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
31.07.2014, 05:23 #19
Цитата Сообщение от Winorun Посмотреть сообщение
конструктор с видимостью на все обьекты,
Это как????
объект это физическая сущность, он место в памяти занимает
а конструктор это часть класса, описание
это две разных сущности
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:27 #20
В класе масив указателей на свои обьекты , в конструкторе ищешь существует обьект или нет, если сущ-т возвращаешь сылку, нет создаещь новый.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
31.07.2014, 05:29 #21
попробуем подойти по другому
отвлечемся от программирования
вот есть класс человек, описание его сущностей
и есть объект Winorun,
и с ним нужно работать
очень просто во все справочники забиваем этот объект, выдаем ему паспорт
но как создать еще один объект Winorun
причем он должен полностью повторять первый, т.е создать клон
Но он должен и занимать тоже время и пространство что и первый
противоречий не видишь?
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 480
31.07.2014, 05:31 #22
как ты из конструктора вернёшь ссылку?
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:32 #23
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 480
31.07.2014, 05:33 #24
Winorun, как ты из конструктора вернёшь ссылку?
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:37 #25
Либо я плохо обьесняю либо вы не понимаете.

Добавлено через 1 минуту
я бы код кинул, но смогу это сделать не раньше обеда
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
31.07.2014, 05:39 #26
Цитата Сообщение от Winorun Посмотреть сообщение
В класе масив указателей на свои обьекты ,
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
но что то мне подсказывает что от такой оптимизации только хуже будет
например как узнать что такой объект существует?
по какому критерию? только по содержимому строки ? или какой то идентификатор?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:39 #27
Цитата Сообщение от Winorun Посмотреть сообщение
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
Попытка как будет выглядеть?
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:42 #28
alsav22, тебе ValeryS, подробно и обстоятельно расписал
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
31.07.2014, 05:44 #29
Цитата Сообщение от Winorun Посмотреть сообщение
alsav22, тебе ValeryS, подробно и обстоятельно расписал
что я расписал
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:46 #30
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 05:46
Привет! Вот еще темы с ответами:

Нужно ли создавать новый Render для каждого нового объекта (SDL2)? - C++
Есть окно сделанное с помощью SDL2 и класс объекта. Нужно нарисовать множество таких объектов, которые будут менять свои характеристики...

Передача объекта методу другого объекта другого класса - C++
Всем привет. Есть у меня класс test1, который имеет конструкторы только с параметрами. Другой класс test2 имеет конструктор, который...

Доступ к методам класса без создания объекта - C++
Почему доступны методы foo() и bar() класса А, если нет ни одного объекта это класса? #include &lt;iostream&gt; class A { int...

Отмена создания объекта при неверных аргументах - C++
Всем привет! Как можно проверить инициализирующие параметры на ошибочность и при ошибке отменить создание объекта? class Person ...


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

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

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