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

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

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

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

31.07.2014, 02:08. Просмотров 839. Ответов 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
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 481
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;
   }
}
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 02:46  [ТС] #3
Цитата Сообщение от dalay_lama Посмотреть сообщение
this = p;
this нельзя же присваивать. Оно же константа.
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 481
31.07.2014, 02:58 #4
Цитата Сообщение от QGuest Посмотреть сообщение
this нельзя же присваивать. Оно же константа.
Да, согласен, сглупил. Но я всё равно не могу понять зачем вам такое надо. Что вам мешает не создавать новый объект, а просто отдавать адрес уже существующего?
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 03:25  [ТС] #5
Цитата Сообщение от dalay_lama Посмотреть сообщение
зачем вам такое надо
Объектов Word будет много и повторятся он будут довольно часто. Так вот хочу сделать такую оптимизацию) Не уверен что что-то выиграю с этого, но все же...
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 481
31.07.2014, 03:41 #6
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
почему не подходит?
или ссылку - как удобней
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 03:53  [ТС] #7
Цитата Сообщение от dalay_lama Посмотреть сообщение
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
таким способом как-раз и неудобно.
У меня этих объектов будет много. Я ж не смогу в каждый метод где я их использую передавать массив уже прежде созданных вордов. Это неправильно.
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 481
31.07.2014, 03:58 #8
ну так, создай объект Word word;
и где надо отдавай его адрес, Word* newWord = &word;
почему не подходит?
Цитата Сообщение от QGuest Посмотреть сообщение
У меня этих объектов будет много. Я ж не смогу в каждый метод где я их использую передавать массив уже прежде созданных вордов. Это неправильно
это почему?
не нравится передавать в методы нужные тебе объекты? ну ладно, объяви этот массив глобально тогда
покажи примеры этих методов и почему туда нельзя передавать адреса или ссылки уже созданных объектов
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 04:09  [ТС] #9
Цитата Сообщение от dalay_lama Посмотреть сообщение
не нравится передавать в методы нужные тебе объекты? ну ладно, объяви этот массив глобально тогда
покажи примеры этих методов и почему туда нельзя передавать адреса или ссылки уже созданных объектов
Я неправильно выразился. Я конечно могу их туда передать но так делать неправильно.
Я же говорю, что я просто хотел сделать эдакую оптимизацию, чтобы не было повторов и лишнего забивания памяти.
Просто сам Word должен управлять своими экземплярами, а не я внешне.
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 481
31.07.2014, 04:22 #10
Я понял, что ты имел введу, и именно это выражение меня и смутило:
Цитата Сообщение от QGuest Посмотреть сообщение
Я конечно могу их туда передать но так делать неправильно
Почему не правильно передавать в метод существующий объект? Ссылки для того и придумали, чтобы передавать существующие объекты и
Цитата Сообщение от QGuest Посмотреть сообщение
чтобы не было повторов и лишнего забивания памяти
Приведи пример пожалуйста, когда этого делать нельзя, я правда не могу тебя понять.

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

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

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

Покажи пример метода, в котором ты хочешь создать объект, но при этом тебе вернули уже созданый
0
QGuest
8 / 8 / 0
Регистрация: 08.01.2013
Сообщений: 85
31.07.2014, 05:10  [ТС] #15
Цитата Сообщение от dalay_lama Посмотреть сообщение
это не возможно и ты мне сам же напомнил почему
это я про this говорил.
Может быть такое можно провернуть по другому.
0
31.07.2014, 05:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 05:10
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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