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

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

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

Author24 — интернет-сервис помощи студентам
Есть класс 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:...

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

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

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

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

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

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

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

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

И ещё раз
Цитата Сообщение от dalay_lama Посмотреть сообщение
Покажи пример метода, в котором ты хочешь создать объект, но при этом тебе вернули уже созданый
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:19 18
конструктор с видимостью на все обьекты, а там поиск отсортированного значения. В чем проблема?
0
Модератор
Эксперт по электронике
8954 / 6720 / 921
Регистрация: 14.02.2011
Сообщений: 23,717
31.07.2014, 05:23 19
Цитата Сообщение от Winorun Посмотреть сообщение
конструктор с видимостью на все обьекты,
Это как????
объект это физическая сущность, он место в памяти занимает
а конструктор это часть класса, описание
это две разных сущности
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
31.07.2014, 05:27 20
В класе масив указателей на свои обьекты , в конструкторе ищешь существует обьект или нет, если сущ-т возвращаешь сылку, нет создаещь новый.
0
31.07.2014, 05:27
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2014, 05:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Golang] 121. Best Time to Buy and Sell Stock
alhaos 28.01.2025
В этой задаче мы получаем слайс целых чисел, которые означают цену акции в разные моменты времени, и должны вернуть максимально возможную прибыль от купли продажи акции. / / . . .
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru