3

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

我的意思是如果我有

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

3 回答 3

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>          ]
于 2012-06-27T08:03:56.943 回答
0

我知道这是一个老问题,但我相信按照休伯特的回答,有一种方法可以做到这一点您可以定义一个抽象类,强制所有子类使用模板实现一些复制方法:

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 继承的类包含复制构造函数本身,但我认为这是下一个最好的事情。有什么想法/改进吗?

于 2018-10-11T14:46:08.203 回答
-5

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

于 2012-06-26T13:47:47.277 回答