Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > сделать невозможным присвоение


Автор: Alek86 21.2.2008, 11:18
задачка не из жизни, просто интересно, какое лучшее решение придумают:

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

Автор: marcusmae 21.2.2008, 11:38
Константный объект?

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

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

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


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

ну и?

Код

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

С с1, с2;
c1 = c2;

Автор: SABROG 21.2.2008, 11:54
Перегрузи оператор = в классе и делай что хочешь.

Автор: Mayk 21.2.2008, 12:02
Код

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

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



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

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

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



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

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

Автор: xvr 21.2.2008, 12:43
Цитата(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 

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

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

Автор: Dimonius 21.2.2008, 18:10
А не о синглтоне ли здесь речь?

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

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

ок, сорри за флейм в решенной теме

Автор: Alek86 21.2.2008, 18:44
не оно

Цитата
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

Автор: 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

Автор: xvr 23.2.2008, 08:49
Цитата(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'а)

Автор: Fazil6 23.2.2008, 10:23
georain, 
в следующий раз, когда будешь из книги переписывать в форум, читай повнимательнее и перечитывай то, что написал

Автор: georain 23.2.2008, 16:10
Извините, а что я не так сделал?

Автор: Fazil6 23.2.2008, 17:54
Цитата(georain @  23.2.2008,  15:10 Найти цитируемый пост)
Извините, а что я не так сделал?

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

Автор: georain 23.2.2008, 23:00
Цитата(Fazil6 @  23.2.2008,  17:54 Найти цитируемый пост)
а во вторых, если даже после моего замечания прочтя свое сообщение ты не видишь ошибки, то можно прийти к выводу, что ты просто тупо переписал из книги слабо понимая, что именно означает, то что пишешь 

Укажите мне неграмотному, где ошибка, не вижу ошибки.

Автор: Lazin 23.2.2008, 23:38
georain, все дело вот в чем
Цитата(georain @  23.2.2008,  01:05 Найти цитируемый пост)
protected:
    Uncopyable () {}                              // разрешить копирование
    ~Uncopyable () {} 

конструктор и деструктор базового класса - защищенные
Цитата(georain @  23.2.2008,  01:05 Найти цитируемый пост)
class HomeForSale : private Uncopyable {

и наследование закрытое - в результате нельзя создать объект класса HomeForSale, хотя возможна ситуация когда это то что нам надо smile

Автор: Fazil6 24.2.2008, 10:33
2Lazin
вот уж точно - лучше молчать чем говорить...


georain, почитай коменты свои

Автор: Daevaorn 24.2.2008, 12:16
Прицепился к банальному typo и рад. Фе!

Автор: JackYF 24.2.2008, 12:18
Люди, спокойно и без оскорблений, пожалуйста.

Автор: MAKCim 24.2.2008, 12:47
Fazil6, 

M
MAKCim
Реагируйте спокойнее!

Автор: Lazin 24.2.2008, 13:33
Да уж, я почему-то думал, что при закрытом наследовании в производном классе доступны только public методы  smile , просто этой возможностью языка редко приходилось пользоваться...
а за минус спасибо, мой первый минус на форуме  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)