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

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

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

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

31.07.2014, 02:08. Просмотров 752. Ответов 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;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 02:08     Передача существующего объекта вместо создания нового
Посмотрите здесь:

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

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

Написать функцию для создания нового файла - 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...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
31.07.2014, 05:29     Передача существующего объекта вместо создания нового #21
попробуем подойти по другому
отвлечемся от программирования
вот есть класс человек, описание его сущностей
и есть объект Winorun,
и с ним нужно работать
очень просто во все справочники забиваем этот объект, выдаем ему паспорт
но как создать еще один объект Winorun
причем он должен полностью повторять первый, т.е создать клон
Но он должен и занимать тоже время и пространство что и первый
противоречий не видишь?
dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 440
31.07.2014, 05:31     Передача существующего объекта вместо создания нового #22
как ты из конструктора вернёшь ссылку?
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:32     Передача существующего объекта вместо создания нового #23
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 440
31.07.2014, 05:33     Передача существующего объекта вместо создания нового #24
Winorun, как ты из конструктора вернёшь ссылку?
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:37     Передача существующего объекта вместо создания нового #25
Либо я плохо обьесняю либо вы не понимаете.

Добавлено через 1 минуту
я бы код кинул, но смогу это сделать не раньше обеда
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
31.07.2014, 05:39     Передача существующего объекта вместо создания нового #26
Цитата Сообщение от Winorun Посмотреть сообщение
В класе масив указателей на свои обьекты ,
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
но что то мне подсказывает что от такой оптимизации только хуже будет
например как узнать что такой объект существует?
по какому критерию? только по содержимому строки ? или какой то идентификатор?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:39     Передача существующего объекта вместо создания нового #27
Цитата Сообщение от Winorun Посмотреть сообщение
Не понял зачем создавать новый когда При попытки создать еще одного Winorun, говорим место сужествования текущего
Попытка как будет выглядеть?
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:42     Передача существующего объекта вместо создания нового #28
alsav22, тебе ValeryS, подробно и обстоятельно расписал
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
31.07.2014, 05:44     Передача существующего объекта вместо создания нового #29
Цитата Сообщение от Winorun Посмотреть сообщение
alsav22, тебе ValeryS, подробно и обстоятельно расписал
что я расписал
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:46     Передача существующего объекта вместо создания нового #30
заведи статический массив указателей а лучше список или вектор и сравнивай,
но создавать объект ты можешь только динамически, и придется переопределять new
т.е вызывается оператор new
проверяет есть ли такой объект в списке, если есть возвращает указатель
если нет выделяет память и вызывает конструктор
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 05:46     Передача существующего объекта вместо создания нового #31
Цитата Сообщение от Winorun Посмотреть сообщение
тебе ValeryS, подробно и обстоятельно расписал
Я у тебя спросил.
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Чтобы это сделать уже должен быть создан новый объект, иначе, что сравнивать? А ТС нужно:
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы вместо создания нового объекта Word передавался уже созданный
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:47     Передача существующего объекта вместо создания нового #32
Ты меня тролишь чтоЛИ
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
31.07.2014, 05:59     Передача существующего объекта вместо создания нового #33
Сообщение было отмечено автором темы, экспертом или модератором как ответ
QGuest, вам тут советуют что-то не то. Или вы не понимаете, чего хотите . Если вы хотите класс строк как в Джаве: неизменяемые, и чтобы код
Цитата Сообщение от QGuest Посмотреть сообщение
C++
1
2
3
Word word1 = "some";
Word word2 = "some";
cout << (&word1 == &word2); //правда. Один и тот-же обьект
работал, то это одно (так и назовите тему - хочу строки как в Джава. Кстати, будет хорошее сравнение Джавы и плюсов). Однако даже Джава может вам гарантировать идентичность строк только в пределе одного class-файла (знатоки Java, подправьте, если я не прав). Если вам просто кажется, что так будет быстрее - это другое (скорее всего нет, не будет - как минимум время будет уходить на поиск строки в глобальном пуле объектов. И при миллионе строк создание новой пустой строки будет занимать кучу времени. Оно вам надо?). Подумайте, как вся эта радость будет работать в многопоточной среде (ещё одни расходы на отслеживание одинаковости строк в разных потоках).

Как я понял, вам вполне подойдёт строка со счётчиком ссылок. Пример реализации описан у Страуструпа (примерно глава 7, пункт 6 во втором издании и далее).
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
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; // удаляем
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:24     Передача существующего объекта вместо создания нового #35
Цитата Сообщение от ValeryS Посмотреть сообщение
A* aa=/*здесь сравниваем с уже созданными если есть вернем указатель, если нет то NULL */
С уже созданными, ЧТО сравниваем?
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
31.07.2014, 06:34     Передача существующего объекта вместо создания нового #36
Цитата Сообщение от alsav22 Посмотреть сообщение
С уже созданными, ЧТО сравниваем?
а я, знаю???
аргументы которые передаются в конструктор, строка наверное
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.07.2014, 06:46     Передача существующего объекта вместо создания нового #37
Цитата Сообщение от ValeryS Посмотреть сообщение
аргументы которые передаются в конструктор, строка наверное
Ну, так не объект же:
Цитата Сообщение от ValeryS Посмотреть сообщение
проверяет есть ли такой объект в списке,
Метод A::new() где будет вызываться?
ValeryS
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,636
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 Посмотреть сообщение
проверяет есть ли такой объект в списке,
правильней сказать
проверить есть ли объект с таким содержимым
alsav22
31.07.2014, 08:36
  #39

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 10:48     Передача существующего объекта вместо создания нового
Еще ссылки по теме:

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

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

Занесение объекта в список в момент его создания - C++
Хочу реализовать подобную конструкцию для отображения всех объектов сразу с помощью статического листа ссылок, но ругается на _Ptr...

Передача в функцию константы вместо указателя - C++
Копаясь в чужом коде, обнаружил для себя странность в вызове функции. В C++ я разбираюсь слабо. Функция (точнее метод класса)...


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

Или воспользуйтесь поиском по форуму:
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
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);
}
Yandex
Объявления
31.07.2014, 10:48     Передача существующего объекта вместо создания нового
Ответ Создать тему
Опции темы

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