两种关闭拷贝构造的手法:
1.宏:
(来自chrome)
// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) /
TypeName(const TypeName&); /
void operator=(const TypeName&)
sample:
class CTest
{
public:
CTest();
virtual ~CTest();
private:
DISALLOW_COPY_AND_ASSIGN(CTest);
};
2.继承的手法
(来自boost)
// Private copy constructor and copy assignment ensure classes derived from
// class noncopyable cannot be copied.
// Contributed by Dave Abrahams
namespace noncopyable_ // protection from unintended ADL
{
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};
}
typedef noncopyable_::noncopyable noncopyable;
sample:
class CTest : noncopyable
{
public:
CTest();
virtual ~CTest();
};
说说我自己的看法:
曾经也写过一个类似boost这个小工具基类,但是现在是尽量避免使用继承的;应为难以预测到以后这个class
是不是一定就不能拷贝。而且我比较追求完美,会给积累加上虚析构,还有就是operator = 也会弄成虚的,,,
问题很多,应为刚刚设计的时候就需要决定他的命运,nonecopyable.但是往往中途会发现,应该赋予他copy的能
力,,,
后来自己的代码中都是手工编写代码来关闭拷贝;
进来想了很多东西,觉得抽象是需要经验积累的,在固定的领域有了积累才能不断调整出漂亮的业务模型。如果
以上手就开始高度抽象,接下来肯定是无尽的修改;而换一种思路,在最底层做原子级的抽象,业务会更好,原子
是稳定的,在原子上在做出稍微高一点的抽象这样修改的代价就会小很多。应为原子级别上的工作结果得到保存。
另外,最为一个IT从业者,必须要明白,代码复用不是目的而是结果。
大量的重构才能带来一个可复用的漂亮的作品;应为他是进过千锤百炼的,切合需求的。所以他是可以复用的。
只有原子画才能达到这个目的。对于一个成熟的行业,所有的流程都是按部就班,它的原子划分可以很大。
但是一个好习惯是,尽可能更加的细化,