Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сделать невозможным присвоение 
V
    Опции темы
Alek86
Дата 21.2.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



задачка не из жизни, просто интересно, какое лучшее решение придумают:

сделать такой класс, объекты которого нельзя присваивать друг другу нигде в программе (важная часть задачи - даже в функциях-членах самого этого класса). По возможности, чтобы при попытке присвоения получалась ошибка, по которой легко догадаться о ее причине.


--------------------
user posted image    user posted image
PM MAIL   Вверх
marcusmae
Дата 21.2.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Константный объект?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
SABROG
Дата 21.2.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Если константный способ не подходит, то можно воспользоваться правилом хорошего тона при разработке классов и доступ к переменным предоставлять через публичные методы setVariable()/getVariable(), а там уже хоть "#error Обшибко, низзя так делать!"


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Alek86
Дата 21.2.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(marcusmae @  21.2.2008,  11:38 Найти цитируемый пост)
Константный объект?

не константный. можно сказать, неклонируемый


Цитата(SABROG @  21.2.2008,  11:46 Найти цитируемый пост)
Если константный способ не подходит, то можно воспользоваться правилом хорошего тона при разработке классов и доступ к переменным предоставлять через публичные методы setVariable()/getVariable(), а там уже хоть "#error Обшибко, низзя так делать!"

ну и?

Код

class C {
  /*реализация, как ты сказал*/
};

С с1, с2;
c1 = c2;



--------------------
user posted image    user posted image
PM MAIL   Вверх
SABROG
Дата 21.2.2008, 11:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Перегрузи оператор = в классе и делай что хочешь.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mayk
Дата 21.2.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Код

class AssignmentProhibited
{
    private:
    AssignmentProhibited& operator=(const AssignmentProhibited&);
};

class Class : private AssignmentProhibited
{
    void doesNotWork()
    {
        Class x;
        x = x;
    }
};



Добавлено через 23 секунды
Задача емнип решена в boost.non_copyable 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 21.2.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(SABROG @  21.2.2008,  11:54 Найти цитируемый пост)
Перегрузи оператор = в классе и делай что хочешь.

делаю я и так, что хочу почти, но в условии задачи была оговорка (нужно было ее жирным выделить) о том, чтобы в классе тоже нельзя было присваивать



Цитата(Mayk @  21.2.2008,  12:02 Найти цитируемый пост)
Задача емнип решена в boost.non_copyable 

да, это оно, кажется. надо почаще в буст заглядывать - ато я для решения задачи с шаблонами мучился....


--------------------
user posted image    user posted image
PM MAIL   Вверх
xvr
Дата 21.2.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Alek86 @ 21.2.2008,  12:10)
Цитата(SABROG @  21.2.2008,  11:54 Найти цитируемый пост)
Перегрузи оператор = в классе и делай что хочешь.

делаю я и так, что хочу почти, но в условии задачи была оговорка (нужно было ее жирным выделить) о том, чтобы в классе тоже нельзя было присваивать

Так оно и будет, если не сделать реализации оператора присваивания. Вот только ошибка будет не compile а link time

Цитата

Цитата(Mayk @  21.2.2008,  12:02 Найти цитируемый пост)
Задача емнип решена в boost.non_copyable 

да, это оно, кажется. надо почаще в буст заглядывать - ато я для решения задачи с шаблонами мучился....
А это будет compile time  smile 
PM MAIL   Вверх
Alek86
Дата 21.2.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(xvr @  21.2.2008,  12:43 Найти цитируемый пост)
Вот только ошибка будет не compile а link time

для разработки библиотеки (да и любого класса, который будут другие пользовать) link time не подходит - потому не считается smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dimonius
Дата 21.2.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



А не о синглтоне ли здесь речь?
PM MAIL   Вверх
Alek86
Дата 21.2.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



нет
Единый эелемент отличается от Некопируемого


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dimonius
Дата 21.2.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



Цитата(Alek86 @  21.2.2008,  18:28 Найти цитируемый пост)
Единый эелемент отличается от Некопируемого

ок, сорри за флейм в решенной теме
PM MAIL   Вверх
Alek86
Дата 21.2.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не оно

Цитата
1>.\Proba.cpp(16) : warning C4100: 'original' : unreferenced formal parameter
1>.\Proba.cpp(20) : error C2512: 'C' : no appropriate default constructor available
1>.\Proba.cpp(20) : error C2512: 'C' : no appropriate default constructor available



--------------------
user posted image    user posted image
PM MAIL   Вверх
georain
Дата 23.2.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Код

class Uncopyable {
protected:
    Uncopyable () {}                              // разрешить создание
    ~Uncopyable () {}                             // и уничтожение
                                                  // объектов производных классов

private:
    Uncopyable(const Uncopyable&);                // но предотвратить копирование.
    Uncopyable& operator=(const Uncopyable&);     // заметьте, только объявление, определение отсутствует
};


Чтобы предотвратить копирование объектов HomeForSale, нужно лишь унаследовать его от Uncopyable:

Код

class HomeForSale : private Uncopyable {
    ...
}


Effective C++ 3thEd правило 6

Это сообщение отредактировал(а) georain - 24.2.2008, 23:27
PM MAIL   Вверх
xvr
Дата 23.2.2008, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(georain @ 23.2.2008,  01:05)
Код

class Uncopyable {
protected:
    Uncopyable () {}                              // разрешить копирование
    ~Uncopyable () {}                             // и уничтожение
                                                  // объектов производных классов

private:
    Uncopyable(const Uncopyable&);                // но предотвратить копирование.
    Uncopyable& operator=(const Uncopyable&);     // заметьте, только объявление, определение отсутствует
};


Чтобы предотвратить копирование объектов HomeForSale, нужно лишь унаследовать его от Uncopyable:

Код

class HomeForSale : private Uncopyable {
    ...
}


Effective C++ 3thEd правило 6

От решения, реализованного в boost отличается только именем класса (и тем, что в boost'е это все еще дополнительно завернуто в 2 namespace'а)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0855 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.