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

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

Восстановить пароль Регистрация
 
 
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 02:08     Передача существующего объекта вместо создания нового #1
Есть класс 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++ передача объекта в метод
C++ В чем разница создания объекта?
C++ Передача объекта в метод
C++ Передача объекта методу другого объекта другого класса
C++ Отмена создания объекта при неверных аргументах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 02:40     Передача существующего объекта вместо создания нового #2
Даже не знаю, единственное что приходит в голову, завести статическую переменную указатель на этот класс, в начале её инициализировать значением NULL, а потом в конструкторе проверять, если указатель равен NULL, тогда задать свойства объекта, а указателю дать адрес this, а при последующем вызове конструктора, т.к. указатель уже не будет NULL, возвращать адрес, который он хранит. Только зачем вам это надо?

Добавлено через 5 минут
ну что-то типа такого:
.h
C++
1
2
3
4
5
6
class Word
{
private;
   static Word* p;
//...
}
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
static Word* p = NULL;
Word::Word()
{
   if (p == NULL) {
      //задаём значения для свойств
      p = this;
   }
   else {
      this = p;
   }
}
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 02:46  [ТС]     Передача существующего объекта вместо создания нового #3
Цитата Сообщение от dalay_lama Посмотреть сообщение
this = p;
this нельзя же присваивать. Оно же константа.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 02:58     Передача существующего объекта вместо создания нового #4
Цитата Сообщение от QGuest Посмотреть сообщение
this нельзя же присваивать. Оно же константа.
Да, согласен, сглупил. Но я всё равно не могу понять зачем вам такое надо. Что вам мешает не создавать новый объект, а просто отдавать адрес уже существующего?
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 03:25  [ТС]     Передача существующего объекта вместо создания нового #5
Цитата Сообщение от dalay_lama Посмотреть сообщение
зачем вам такое надо
Объектов Word будет много и повторятся он будут довольно часто. Так вот хочу сделать такую оптимизацию) Не уверен что что-то выиграю с этого, но все же...
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 03:41     Передача существующего объекта вместо создания нового #6
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
почему не подходит?
или ссылку - как удобней
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 03:53  [ТС]     Передача существующего объекта вместо создания нового #7
Цитата Сообщение от dalay_lama Посмотреть сообщение
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
таким способом как-раз и неудобно.
У меня этих объектов будет много. Я ж не смогу в каждый метод где я их использую передавать массив уже прежде созданных вордов. Это неправильно.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 03:58     Передача существующего объекта вместо создания нового #8
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
почему не подходит?
Цитата Сообщение от QGuest Посмотреть сообщение
У меня этих объектов будет много. Я ж не смогу в каждый метод где я их использую передавать массив уже прежде созданных вордов. Это неправильно
это почему?
не нравится передавать в методы нужные тебе объекты? ну ладно, объяви этот массив глобально тогда
покажи примеры этих методов и почему туда нельзя передавать адреса или ссылки уже созданных объектов
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 04:09  [ТС]     Передача существующего объекта вместо создания нового #9
Цитата Сообщение от dalay_lama Посмотреть сообщение
не нравится передавать в методы нужные тебе объекты? ну ладно, объяви этот массив глобально тогда
покажи примеры этих методов и почему туда нельзя передавать адреса или ссылки уже созданных объектов
Я неправильно выразился. Я конечно могу их туда передать но так делать неправильно.
Я же говорю, что я просто хотел сделать эдакую оптимизацию, чтобы не было повторов и лишнего забивания памяти.
Просто сам Word должен управлять своими экземплярами, а не я внешне.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 04:22     Передача существующего объекта вместо создания нового #10
Я понял, что ты имел введу, и именно это выражение меня и смутило:
Цитата Сообщение от QGuest Посмотреть сообщение
Я конечно могу их туда передать но так делать неправильно
Почему не правильно передавать в метод существующий объект? Ссылки для того и придумали, чтобы передавать существующие объекты и
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы не было повторов и лишнего забивания памяти
Приведи пример пожалуйста, когда этого делать нельзя, я правда не могу тебя понять.

Ну если тебе религия не позволяет этого делать, такой ещё выход могу предложить: создай ещё один класс, который будет хранить статическую переменную ссылку или указатель, и статический метод, который будет проверять, если ссылка уже указывает на какой-то объект, то вернуть его, если нет, то создать объект и вернуть.
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 04:33  [ТС]     Передача существующего объекта вместо создания нового #11
Цитата Сообщение от dalay_lama Посмотреть сообщение
Приведи пример пожалуйста, когда этого делать нельзя, я правда не могу тебя понять
Да какой тут может быть пример? Любой же код где будет Word использоваться. И что, мне в КАЖДЫЙ метод массив передавать, на случай, если там окажется нужная мне копия Word? Глупо же.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 04:47     Передача существующего объекта вместо создания нового #12
Цитата Сообщение от QGuest Посмотреть сообщение
Да какой тут может быть пример? Любой же код где будет Word использоваться. И что, мне в КАЖДЫЙ метод массив передавать, на случай, если там окажется нужная мне копия Word? Глупо же.
Глупо не знать, в каком методе, тебе может понадобиться экземпляр класса. Как ты проектируешь программу?
Нужен существующий объект в конкретном методе? - создай соответствующий прототип и передавай туда уже созданный объект - никаких тебе лишних вызовов конструктора и лишнего выделения памяти.

Либо, альтернативы в виде глобального объекта или того, что я тебе написал в предыдущем сообщении.
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 04:54  [ТС]     Передача существующего объекта вместо создания нового #13
Цитата Сообщение от dalay_lama Посмотреть сообщение
Глупо не знать, в каком методе, тебе может понадобиться экземпляр класса
В том той дело, что именно существующий экземпляр мне может быть мне и не нужен. Я могу создать новый ТАКОЙ-ЖЕ из существующих данных. Но я бы хотел, чтобы класс Word при попытке создания нового экземпляра подставлял вместо него ТАКОЙ-ЖЕ существующий.
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 05:07     Передача существующего объекта вместо создания нового #14
Ты меня что-то запутал
Цитата Сообщение от QGuest Посмотреть сообщение
В том той дело, что именно существующий экземпляр мне может быть мне и не нужен
Цитата Сообщение от QGuest Посмотреть сообщение
Но я бы хотел, чтобы класс Word при попытке создания нового экземпляра подставлял вместо него ТАКОЙ-ЖЕ существующий
Тебе нужен существующий класс в методах?

Добавлено через 2 минуты
Цитата Сообщение от dalay_lama Посмотреть сообщение
Но я бы хотел, чтобы класс Word при попытке создания нового экземпляра подставлял вместо него ТАКОЙ-ЖЕ существующий
это не возможно и ты мне сам же напомнил почему. По крайней мере такое нельзя сделать в конструкторе.

Покажи пример метода, в котором ты хочешь создать объект, но при этом тебе вернули уже созданый
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 05:10  [ТС]     Передача существующего объекта вместо создания нового #15
Цитата Сообщение от dalay_lama Посмотреть сообщение
это не возможно и ты мне сам же напомнил почему
это я про this говорил.
Может быть такое можно провернуть по другому.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
31.07.2014, 05:15     Передача существующего объекта вместо создания нового #16
Цитата Сообщение от QGuest Посмотреть сообщение
В том той дело, что именно существующий экземпляр мне может быть мне и не нужен. Я могу создать новый ТАКОЙ-ЖЕ из существующих данных. Но я бы хотел, чтобы класс Word при попытке создания нового экземпляра подставлял вместо него ТАКОЙ-ЖЕ существующий.
что то я не понял ТАКОЙ-ЖЕ это не ЭТОТ-ЖЕ
следовательно создается другой объект и копируются данные
но судя по всему тебе нужен один объект
тогда такой выход вижу:
сделать объект глобальным
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 434
31.07.2014, 05:17     Передача существующего объекта вместо создания нового #17
Цитата Сообщение от QGuest Посмотреть сообщение
это я про this говорил.
Вот именно. Создание объекта - это всегда вызов конструктора, как ты собираешься адрес создаваемого объекта поменять?

И ещё раз
Цитата Сообщение от dalay_lama Посмотреть сообщение
Покажи пример метода, в котором ты хочешь создать объект, но при этом тебе вернули уже созданый
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:19     Передача существующего объекта вместо создания нового #18
конструктор с видимостью на все обьекты, а там поиск отсортированного значения. В чем проблема?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
31.07.2014, 05:23     Передача существующего объекта вместо создания нового #19
Цитата Сообщение от Winorun Посмотреть сообщение
конструктор с видимостью на все обьекты,
Это как????
объект это физическая сущность, он место в памяти занимает
а конструктор это часть класса, описание
это две разных сущности
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 05:27     Передача существующего объекта вместо создания нового
Еще ссылки по теме:

C++ Нужно ли создавать новый Render для каждого нового объекта (SDL2)?
C++ Написать функцию для создания нового файла
Передача объекта в функцию C++

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

Или воспользуйтесь поиском по форуму:
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
31.07.2014, 05:27     Передача существующего объекта вместо создания нового #20
В класе масив указателей на свои обьекты , в конструкторе ищешь существует обьект или нет, если сущ-т возвращаешь сылку, нет создаещь новый.
Yandex
Объявления
31.07.2014, 05:27     Передача существующего объекта вместо создания нового
Ответ Создать тему
Опции темы

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