Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ruslan_abel
33 / 33 / 14
Регистрация: 06.05.2011
Сообщений: 91
#1

Паттерн "Одиночка" и конструктор копии с оператором присваивания - C++

06.11.2011, 18:11. Просмотров 899. Ответов 8
Метки нет (Все метки)

Здравствуйте!
Подскажите пожалуйста с вопросом.
Мне необходимо реализовать паттерн "Одиночка". Необходимо ли перегружать конструктор копии и оператор присваивания для одиночки, что бы исключить возможность создания копии объекта? Я объявил деструктор класса в секции protected. Поэтому, например такая попытка создании копии одиночки:
C++
1
2
Trash tr = *( Trash::Instance() ); // Trash - класс одиночки 
//Trash::Instance() возвращает указатель Trash*
Заканчивается ошибкой компиляции.
error: 'virtual Trash::~Trash()' is protected
Будет ли этого достаточно, что бы гарантировать невозможность создания копии объекта?
Здесь, например, одиночка наследуется от boost::noncopyable(с помощью которого запрещается копирование объекта). Действительно ли необходимо так делать? Или это лишнее?
http://www.cyberforum.ru/cpp-beginners/thread589648.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 18:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Паттерн "Одиночка" и конструктор копии с оператором присваивания (C++):

Паттерн "Итератор" для шаблонного класса "Словарь"
Препод дал задание сделать шаблонный словарь и реализовать для него иттератор....

Singleton. Одиночка. Паттерн
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

8
LosAngeles
Заблокирован
06.11.2011, 18:24 #2
а что препятсвует созданию объекта с помощью обычного new?
0
ruslan_abel
33 / 33 / 14
Регистрация: 06.05.2011
Сообщений: 91
06.11.2011, 18:26  [ТС] #3
Конструктор в protected
0
Bers
Заблокирован
06.11.2011, 18:31 #4
Цитата Сообщение от ruslan_abel Посмотреть сообщение
Действительно ли необходимо так делать? Или это лишнее?
Если над запретить возможность копирования - запрещаем. Если не над - не запрещаем. Ваш К.О.
1
ruslan_abel
33 / 33 / 14
Регистрация: 06.05.2011
Сообщений: 91
06.11.2011, 18:34  [ТС] #5
Ясно.
Спасибо. Просто я думал что можно и без этого обойтись.
0
Bers
Заблокирован
06.11.2011, 18:38 #6
Цитата Сообщение от ruslan_abel Посмотреть сообщение
Спасибо. Просто я думал что можно и без этого обойтись.
Ты подумай, зачем тебе вообще одиночка понадобился?
Если над гарантировать 100% что объект будит создан только в ед. экземпляре, то зачем такому одиночке вообще могут быть нужны копирующие конструкторы?

А все что не нужно, должно быть запрещено. Что бы даже соблазна никакого никогда не возникало. И ругалось матом на стадии компиляции, а не в рантайме.
1
Kastaneda
Jesus loves me
Эксперт С++
4759 / 2962 / 340
Регистрация: 12.12.2009
Сообщений: 7,520
Записей в блоге: 2
Завершенные тесты: 1
06.11.2011, 19:13 #7
Нужно сделать закрытыми конструктор, конструктор копирования и operator=().
1
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 19:17 #8
смотря как одиночка организован, одиночкам копирования могут быть не страшны
1
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
07.11.2011, 09:06 #9
Цитата Сообщение от ruslan_abel Посмотреть сообщение
Здесь, например, одиночка наследуется от boost::noncopyable(с помощью которого запрещается копирование объекта). Действительно ли необходимо так делать? Или это лишнее?
чтобы предотвратить копирование - делают конструктор копирования и оператор присваивания закрытыми и опускают определение.

При таком подходе если случайно вызвать эти методы, будет ошибка на этапе компоновки, а чтобы ошибку переместить на этап компиляции для этого класс унаследовали от базового.
1
07.11.2011, 09:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2011, 09:06
Привет! Вот еще темы с решениями:

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

Компилятор визуаль студио 2008 с++,выскакивает ошибка с оператором вывода "<< "
#include&lt;iostream&gt; using namespace std; int main(){ int s; ...

Игра "Жизнь"; Нужно, чтобы первое поколение задавалось оператором (с клавиатуры)
Нужна помощь с решением задачи &quot;Жизнь&quot; на с++ Есть код программы, которая...

Непонятки с оператором "delete" У меня изумление. Крашится программа (Qt5.5) Win 8
Я никак не могу найти ошибку, из-за которой срабатывание операторы delete...


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

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

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