View Issue Details

IDProjectCategoryView StatusLast Update
0000985Far ManagerBuild Systempublic2009-08-10 09:30
ReporterEvgenyZhirnov Assigned Tochupakabra  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Fixed in Version2.0 
Summary0000985: Предлагаю ввести класс noncopyable
DescriptionПредлагаю ввести класс noncopyable для запрета оператора присваивания и конструктора копирования для того, чтоб избавиться от таких мест:

private:
  UserDefinedList& operator=(const UserDefinedList& rhs); // чтобы не
  UserDefinedList(const UserDefinedList& rhs); // генерировалось по умолчанию

Реализация класса в приложенном файле.
TagsNo tags attached.
Build1058

Activities

EvgenyZhirnov

2009-07-29 10:20

reporter  

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__
noncopyable.hpp (387 bytes)   

chupakabra

2009-07-29 11:41

developer   bugnote:0003803

Сделай полный патч, только оформи код в стиле Far

EvgenyZhirnov

2009-07-29 12:15

reporter  

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 (5,901 bytes)   

EvgenyZhirnov

2009-07-29 12:15

reporter   bugnote:0003804

Добавил полный патч (noncopyable.diff) к ревизии 3302.

Оформил код в стиле Far (правда он в разных файлах свой) :)

chupakabra

2009-07-29 12:37

developer   bugnote:0003806

>> Оформил код в стиле Far (правда он в разных файлах свой) :)
Есть такое дело. Но все же выделить какие-то правила можно. К примеру имена классов пишутся с использованием заглавных букв, т.е. не noncopyable, а NonCopyable. Пробелы после (перед) скобок тоже не ставятся. И вот этот void в скобках, зачем он? Кажется это только для C программ нужно.
Еще, может стоит noncopyable наследовать как private? Вот тут к примеру так:
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin

EvgenyZhirnov

2009-07-29 12:54

reporter  

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__
noncopyable2.diff (6,357 bytes)   

EvgenyZhirnov

2009-07-29 12:57

reporter   bugnote:0003807

Исправил патч.

- void в скобках ставлю для красоты, изящнее выглядит, если очень много методов у класса;
- по умолчанию наследование в C++ private, поэтому это слово можно опустить. Добавил слово private в патч и пример;

EvgenyZhirnov

2009-07-29 13:09

reporter   bugnote:0003808

Поправочка: наследование классов в C++ по умолчанию private. Для структур - public наследование.

chupakabra

2009-07-29 14:26

developer   bugnote:0003809

В contributors указать Evgeny Zhirnov?

EvgenyZhirnov

2009-07-29 14:32

reporter   bugnote:0003810

Да, если можно. :)

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

chupakabra

2009-07-29 15:18

developer   bugnote:0003811

1058

vskirdin

2009-07-29 17:09

administrator   bugnote:0003812

chupakabra, про файлик mkdep.list не забывай :-)
этот файл содержит все сорцы и с помощью "scripts\mkdep.awk" генерит far.vc.dep/far.gcc.dep
нужен для слишком "безумного" nmake

vskirdin

2009-07-29 18:00

administrator   bugnote:0003816

(mkdep.list обновил, скрипт "scripts\mkdep.awk" скорректировал от "самовозбуждения" :-))

EvgenyZhirnov

2009-08-09 12:00

reporter   bugnote:0003892

Этот баг можно уже закрыть. Работа класса NonCopyable видна уже при компиляции.

ujos

2009-08-10 06:56

reporter   bugnote:0003896

vskirdin, заюзайте какой нить кросплатформенный генератор мейк файлов. Сколько еще тянуть можно makefiles, VS SLN?

EvgenyZhirnov

2009-08-10 09:13

reporter   bugnote:0003898

Можно использовать boost build (bjam), но он слишком непонятный для обычного пользователя.

Issue History

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