View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000985 | Far Manager | Build System | public | 2009-07-29 10:20 | 2009-08-10 09:30 |
Reporter | EvgenyZhirnov | Assigned To | chupakabra | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Fixed in Version | 2.0 | ||||
Summary | 0000985: Предлагаю ввести класс noncopyable | ||||
Description | Предлагаю ввести класс noncopyable для запрета оператора присваивания и конструктора копирования для того, чтоб избавиться от таких мест: private: UserDefinedList& operator=(const UserDefinedList& rhs); // чтобы не UserDefinedList(const UserDefinedList& rhs); // генерировалось по умолчанию Реализация класса в приложенном файле. | ||||
Tags | No tags attached. | ||||
Build | 1058 | ||||
|
noncopyable.hpp (387 bytes)
#ifndef __NONCOPYABLE_H__ #define __NONCOPYABLE_H__ /* noncopyable.hpp ����� �� ������� ��������� ����������� � ������������ ���������� */ class noncopyable { protected: noncopyable( void ) {}; ~noncopyable( void ) {}; private: noncopyable( const noncopyable & ); noncopyable & operator=(const noncopyable & ); }; #endif // __NONCOPYABLE_H__ |
|
Сделай полный патч, только оформи код в стиле Far |
|
noncopyable.diff (5,901 bytes)
Index: CFileMask.hpp =================================================================== --- CFileMask.hpp (revision 3303) +++ CFileMask.hpp (working copy) @@ -34,6 +34,7 @@ */ #include "BaseFileMask.hpp" +#include "noncopyable.hpp" enum FM_FLAGS { @@ -43,7 +44,7 @@ }; -class CFileMask +class CFileMask : noncopyable { private: BaseFileMask *FileMask; @@ -58,10 +59,6 @@ bool IsEmpty(); void Free(); - private: - CFileMask& operator=(const CFileMask& rhs); /* ���� �� */ - CFileMask(const CFileMask& rhs); /* ������������� �� ������� */ - }; Index: udlist.hpp =================================================================== --- udlist.hpp (revision 3303) +++ udlist.hpp (working copy) @@ -38,6 +38,7 @@ #include "array.hpp" +#include "noncopyable.hpp" enum UDL_FLAGS { @@ -68,7 +69,7 @@ ~UserDefinedListItem(); }; -class UserDefinedList +class UserDefinedList : noncopyable { private: TArray<UserDefinedListItem> Array; Index: TStack.hpp =================================================================== --- TStack.hpp (revision 3303) +++ TStack.hpp (working copy) @@ -35,9 +35,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "noncopyable.hpp" template <class Object> -class TStack +class TStack : noncopyable { private: struct OneItem @@ -117,10 +118,6 @@ } Size=0; } - - private: - TStack& operator=(const TStack& rhs); /* ���� �� ������������� */ - TStack(const TStack& rhs); /* �� ������� */ }; #endif // _TSTACK_HPP_ Index: macro.cpp =================================================================== --- macro.cpp (revision 3303) +++ macro.cpp (working copy) @@ -310,10 +310,6 @@ return *var; return Error; } - - private: - TVMStack& operator=(const TVMStack& rhs); /* ���� �� ������������� */ - TVMStack(const TVMStack& rhs); /* �� ������� */ }; TVMStack VMStack; Index: FileMasksProcessor.hpp =================================================================== --- FileMasksProcessor.hpp (revision 3303) +++ FileMasksProcessor.hpp (working copy) @@ -65,10 +65,6 @@ int n; bool bRE; -private: - FileMasksProcessor& operator=(const FileMasksProcessor& rhs); /* ���� �� */ - FileMasksProcessor(const FileMasksProcessor& rhs); /* ������������� �� ������� */ - }; #endif // __FileMasksProcessor_HPP Index: BaseFileMask.hpp =================================================================== --- BaseFileMask.hpp (revision 3303) +++ BaseFileMask.hpp (working copy) @@ -33,7 +33,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -class BaseFileMask +#include "noncopyable.hpp" + +class BaseFileMask : noncopyable { public: BaseFileMask() {} @@ -44,10 +46,6 @@ virtual bool Compare(const wchar_t *Name)=0; virtual bool IsEmpty() { return true; } - private: - BaseFileMask& operator=(const BaseFileMask& rhs); /* ���� �� */ - BaseFileMask(const BaseFileMask& rhs); /* ������������� �� ������� */ - }; Index: FileMasksWithExclude.hpp =================================================================== --- FileMasksWithExclude.hpp (revision 3303) +++ FileMasksWithExclude.hpp (working copy) @@ -56,10 +56,6 @@ private: FileMasksProcessor Include, Exclude; - -private: - FileMasksWithExclude& operator=(const FileMasksWithExclude& rhs); /* ���� �� */ - FileMasksWithExclude(const FileMasksWithExclude& rhs); /* ������������� �� ������� */ }; #endif // __FileMasksWithExclude_HPP Index: noncopyable.hpp =================================================================== --- noncopyable.hpp (revision 0) +++ noncopyable.hpp (revision 0) @@ -0,0 +1,53 @@ +#ifndef __NONCOPYABLE_H__ +#define __NONCOPYABLE_H__ +/* +noncopyable.hpp +����� �� �������� ������� ��������� ����������� � ������������ ����������. + +������ �����������: + +#include "noncopyable.hpp" +class YourClass : noncopyable +{ +}; + +*/ +/* +Copyright (c) 2009 Far Group +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class noncopyable +{ + private: + noncopyable( const noncopyable & ); + noncopyable & operator=(const noncopyable & ); + + protected: + noncopyable( void ) {}; + ~noncopyable( void ) {}; + +}; +#endif // __NONCOPYABLE_H__ |
|
Добавил полный патч (noncopyable.diff) к ревизии 3302. Оформил код в стиле Far (правда он в разных файлах свой) :) |
|
>> Оформил код в стиле Far (правда он в разных файлах свой) :) Есть такое дело. Но все же выделить какие-то правила можно. К примеру имена классов пишутся с использованием заглавных букв, т.е. не noncopyable, а NonCopyable. Пробелы после (перед) скобок тоже не ставятся. И вот этот void в скобках, зачем он? Кажется это только для C программ нужно. Еще, может стоит noncopyable наследовать как private? Вот тут к примеру так: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin |
|
noncopyable2.diff (6,357 bytes)
Index: CFileMask.hpp =================================================================== --- CFileMask.hpp (revision 3303) +++ CFileMask.hpp (working copy) @@ -34,6 +34,7 @@ */ #include "BaseFileMask.hpp" +#include "noncopyable.hpp" enum FM_FLAGS { @@ -43,7 +44,7 @@ }; -class CFileMask +class CFileMask : private NonCopyable { private: BaseFileMask *FileMask; @@ -58,10 +59,6 @@ bool IsEmpty(); void Free(); - private: - CFileMask& operator=(const CFileMask& rhs); /* ���� �� */ - CFileMask(const CFileMask& rhs); /* ������������� �� ������� */ - }; Index: udlist.hpp =================================================================== --- udlist.hpp (revision 3303) +++ udlist.hpp (working copy) @@ -38,6 +38,7 @@ #include "array.hpp" +#include "noncopyable.hpp" enum UDL_FLAGS { @@ -68,7 +69,7 @@ ~UserDefinedListItem(); }; -class UserDefinedList +class UserDefinedList : private NonCopyable { private: TArray<UserDefinedListItem> Array; @@ -83,10 +84,6 @@ static int __cdecl CmpItems(const UserDefinedListItem **el1, const UserDefinedListItem **el2); - private: - UserDefinedList& operator=(const UserDefinedList& rhs); // ���� �� - UserDefinedList(const UserDefinedList& rhs); // ������������� �� ������� - public: // �� ������� ������������ ������� ';' � ',', � // ProcessBrackets=AddAsterisk=PackAsterisks=false Index: TStack.hpp =================================================================== --- TStack.hpp (revision 3303) +++ TStack.hpp (working copy) @@ -35,9 +35,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "noncopyable.hpp" template <class Object> -class TStack +class TStack : private NonCopyable { private: struct OneItem @@ -117,10 +118,6 @@ } Size=0; } - - private: - TStack& operator=(const TStack& rhs); /* ���� �� ������������� */ - TStack(const TStack& rhs); /* �� ������� */ }; #endif // _TSTACK_HPP_ Index: macro.cpp =================================================================== --- macro.cpp (revision 3303) +++ macro.cpp (working copy) @@ -310,10 +310,6 @@ return *var; return Error; } - - private: - TVMStack& operator=(const TVMStack& rhs); /* ���� �� ������������� */ - TVMStack(const TVMStack& rhs); /* �� ������� */ }; TVMStack VMStack; Index: FileMasksProcessor.hpp =================================================================== --- FileMasksProcessor.hpp (revision 3303) +++ FileMasksProcessor.hpp (working copy) @@ -65,10 +65,6 @@ int n; bool bRE; -private: - FileMasksProcessor& operator=(const FileMasksProcessor& rhs); /* ���� �� */ - FileMasksProcessor(const FileMasksProcessor& rhs); /* ������������� �� ������� */ - }; #endif // __FileMasksProcessor_HPP Index: BaseFileMask.hpp =================================================================== --- BaseFileMask.hpp (revision 3303) +++ BaseFileMask.hpp (working copy) @@ -33,7 +33,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -class BaseFileMask +#include "noncopyable.hpp" + +class BaseFileMask : private NonCopyable { public: BaseFileMask() {} @@ -44,10 +46,6 @@ virtual bool Compare(const wchar_t *Name)=0; virtual bool IsEmpty() { return true; } - private: - BaseFileMask& operator=(const BaseFileMask& rhs); /* ���� �� */ - BaseFileMask(const BaseFileMask& rhs); /* ������������� �� ������� */ - }; Index: FileMasksWithExclude.hpp =================================================================== --- FileMasksWithExclude.hpp (revision 3303) +++ FileMasksWithExclude.hpp (working copy) @@ -56,10 +56,6 @@ private: FileMasksProcessor Include, Exclude; - -private: - FileMasksWithExclude& operator=(const FileMasksWithExclude& rhs); /* ���� �� */ - FileMasksWithExclude(const FileMasksWithExclude& rhs); /* ������������� �� ������� */ }; #endif // __FileMasksWithExclude_HPP Index: noncopyable.hpp =================================================================== --- noncopyable.hpp (revision 0) +++ noncopyable.hpp (revision 0) @@ -0,0 +1,53 @@ +#ifndef __NONCOPYABLE_H__ +#define __NONCOPYABLE_H__ +/* +noncopyable.hpp +����� �� �������� ������� ��������� ����������� � ������������ ����������. + +������ �����������: + +#include "noncopyable.hpp" +class YourClass : private NonCopyable +{ +}; + +*/ +/* +Copyright (c) 2009 Far Group +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class NonCopyable +{ + private: + NonCopyable(const NonCopyable &); + NonCopyable & operator=(const NonCopyable &); + + protected: + NonCopyable() {}; + ~NonCopyable() {}; + +}; +#endif // __NONCOPYABLE_H__ |
|
Исправил патч. - void в скобках ставлю для красоты, изящнее выглядит, если очень много методов у класса; - по умолчанию наследование в C++ private, поэтому это слово можно опустить. Добавил слово private в патч и пример; |
|
Поправочка: наследование классов в C++ по умолчанию private. Для структур - public наследование. |
|
В contributors указать Evgeny Zhirnov? |
|
Да, если можно. :) Если этот патч прошел, значит я могу продолжить. Хочу добавить в операторы присваивания и конструкторы копирования проверку на себя, иначе это может вызывать многочисленные мелкие баги. |
|
1058 |
|
chupakabra, про файлик mkdep.list не забывай :-) этот файл содержит все сорцы и с помощью "scripts\mkdep.awk" генерит far.vc.dep/far.gcc.dep нужен для слишком "безумного" nmake |
|
(mkdep.list обновил, скрипт "scripts\mkdep.awk" скорректировал от "самовозбуждения" :-)) |
|
Этот баг можно уже закрыть. Работа класса NonCopyable видна уже при компиляции. |
|
vskirdin, заюзайте какой нить кросплатформенный генератор мейк файлов. Сколько еще тянуть можно makefiles, VS SLN? |
|
Можно использовать boost build (bjam), но он слишком непонятный для обычного пользователя. |
Date Modified | Username | Field | Change |
---|---|---|---|
2009-07-29 10:20 | EvgenyZhirnov | New Issue | |
2009-07-29 10:20 | EvgenyZhirnov | File Added: noncopyable.hpp | |
2009-07-29 11:41 | chupakabra | Note Added: 0003803 | |
2009-07-29 11:41 | chupakabra | Status | new => assigned |
2009-07-29 11:41 | chupakabra | Assigned To | => chupakabra |
2009-07-29 12:15 | EvgenyZhirnov | File Added: noncopyable.diff | |
2009-07-29 12:15 | EvgenyZhirnov | Note Added: 0003804 | |
2009-07-29 12:37 | chupakabra | Note Added: 0003806 | |
2009-07-29 12:54 | EvgenyZhirnov | File Added: noncopyable2.diff | |
2009-07-29 12:57 | EvgenyZhirnov | Note Added: 0003807 | |
2009-07-29 13:09 | EvgenyZhirnov | Note Added: 0003808 | |
2009-07-29 14:26 | chupakabra | Note Added: 0003809 | |
2009-07-29 14:32 | EvgenyZhirnov | Note Added: 0003810 | |
2009-07-29 15:18 | chupakabra | Note Added: 0003811 | |
2009-07-29 15:18 | chupakabra | Status | assigned => feedback |
2009-07-29 17:09 | vskirdin | Note Added: 0003812 | |
2009-07-29 18:00 | vskirdin | Note Added: 0003816 | |
2009-08-09 12:00 | EvgenyZhirnov | Note Added: 0003892 | |
2009-08-10 06:56 | ujos | Note Added: 0003896 | |
2009-08-10 09:13 | EvgenyZhirnov | Note Added: 0003898 | |
2009-08-10 09:30 | alexy | Build | => 1058 |
2009-08-10 09:30 | alexy | Status | feedback => closed |
2009-08-10 09:30 | alexy | Resolution | open => fixed |
2009-08-10 09:30 | alexy | Fixed in Version | => 2.0 |