鉴于由派生类的继承过多基类,这需要您通过基类指针,每个实体管理这些程序结构.当只知道基类指针时,是否有一种简单的方法来复制整个派生对象?
环顾四周似乎可能(如果非常繁琐)使用dynamic_cast调用来检查基类指针是否可以作为适当的派生类进行转换,然后使用派生类的复制构造函数复制它.然而,这并不是一个真正的最佳解决方案,部分原因是由于过度使用了dynamic_cast,而且它会让人感到头疼,难以维持和扩展.
我遇到的另一个更优雅的解决方案如下:
class Base
{
public:
Base(const Base& other);
virtual Base* getCopy();
...
}
class Derived :public Base
{
Derived(const Derived& other);
virtual Base* getCopy();
...
}
Base* Base::getCopy()
{
return new Base(*this));
}
Base* Derived::getCopy()
{
return static_cast<Base*>(new Derived(*this));
}
Run Code Online (Sandbox Code Playgroud)
然后通过调用getCopy()指向任何派生对象的Base类指针,仍然可以返回一个基类指针,但也复制了整个派生对象.这种方法感觉更易于维护,因为它只需要getCopy()在所有派生类中使用类似的函数,并且不需要针对所有可能的派生对象进行测试.
从本质上讲,这是明智的吗?或者有更好,更简洁的方式吗?
鉴于我想对某些数据执行过滤,如何避免在运行时生成此数据,但保持更改这些过滤器的大小和数据分布的灵活性,同时保持良好的清洁可重用代码.我知道我可以使用模板执行以下操作:
template <int x> class Filter
{
static const float f;
static const Filter<x-1> next;
inline float* begin(const Filter<x>& el){ return &f; }
inline float* end(const Filter<x>& el) { return (&f)+x+1; }
};
template <> class Filter<0>
{
static const float f;
inline float* begin(const Filter<0>& el){ return &f; }
inline float* end(const Filter<0>& el) { return (&f)+1; }
};
template <int x> const float Filter<x>::f = someDistribution(x);
template <> const float Filter<0>::f = someDistribution(0);
Run Code Online (Sandbox Code Playgroud)
根据someDistribution(...),这确实会根据过滤器对象中的索引x在我的过滤器中生成数据.但是我的用途有一些缺点...
1)我认为我说的是,虽然这个数据不是在对象构造上生成的,但是在程序启动时会生成一次. - 我可以容忍,但是我宁愿过滤器在comiletime计算并在那时和那里烘烤(这对于浮点数据是否可能?)
2)过滤器不会实例化"下一个"成员,除非有一个遍历结构长度的成员函数(称为某处!),即 …