我可以强制我的程序员为从基类继承的每个类定义复制构造函数。基类可以实例化。
我的意思是,如果我有
class A {
public
A(const A&);
};
class B : public A {
public
B(const B&); // I want to force my programmers to write this line, any idea????
};
答案 0 :(得分:1)
也许答案在CRTP。
我现在能想到的最接近的解决方案是伪基础和带有私有抽象copy_construct函数的CRTP,以提醒程序员。
template <class Derived>
class Base {
private:
virtual void copy_construct(const Derived& d) = 0;
//btw; unfortunately this isn't possible:
//virtual Derived(const Derived& b) = 0;
};
class PseudoBase : public Base<PseudoBase>
{
public:
PseudoBase() {};
PseudoBase(const PseudoBase& pd)
{
copy_construct(pd);
}
private:
void copy_construct(const PseudoBase& rhs)
{
//copy code
}
};
class Derived : public Base<Derived>
{
//Programmer forgot about copy constructing
};
int _tmain(int argc, _TCHAR* argv[])
{
PseudoBase pb0;
PseudoBase pb1 = pb0;
Derived d0;
Derived d1 = d0;
return 0;
}
构建将失败:
1>d:\source\test\test\test\test.cpp(42): error C2259: 'Derived' : cannot instantiate abstract class
1> due to following members:
1> 'void Base<Derived>::copy_construct(const Derived &)' : is abstract
1> with
1> [
1> Derived=Derived
1> ]
1> d:\source\test\test\test\test.cpp(9) : see declaration of 'Base<Derived>::copy_construct'
1> with
1> [
1> Derived=Derived
1> ]
答案 1 :(得分:0)
我知道这是一个古老的问题,但是我相信,在休伯特(Hubert)的回答之后,有一种方法 可以做到这一点。您可以定义一个抽象类,该抽象类使用模板强制所有子类实现某种复制方法:
template <class X>
class IsCopyable{
protected:
virtual void copy(const X&) = 0
};
然后您可以像这样利用CRTP:
template <class Y>
class AbstractClass : public IsCopyable<Y>{
...
};
假设我们使用ConcreteClass.h从AbstractClass继承:
class ConcreteClass : public AbstractClass<ConcreteClass>{
private:
virtual void copy(const ConcreteClass&) override; // from IsCopyable abstract class
public:
ConcreteClass();
ConcreteClass(const ConcreteClass&);
};
在ConcreteClass.cpp中:
#include "ConcreteClass.h"
void copy(const ConcreteClass& copyme){ // ConcreteClass is forced to implement this
...
}
ConcreteClass(const ConcreteClass& copyme){ // unfortunately, it's not forced to implement this
copy(copyme);
}
它并没有真正迫使从IsCopyable继承的类包括复制构造函数本身,但是我认为这是下一件好事。有什么想法/改进吗?
答案 2 :(得分:-4)
我强烈认为错误和运行时崩溃将迫使您的开发人员编写这一行