C ++:我可以强制我的程序员为每个类定义复制构造函数吗?

时间:2012-06-26 12:31:57

标签: c++ visual-c++

我可以强制我的程序员为从基类继承的每个类定义复制构造函数。基类可以实例化。

我的意思是,如果我有

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????
};

3 个答案:

答案 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)

我强烈认为错误和运行时崩溃将迫使您的开发人员编写这一行