我有一个抽象的虚拟基类Foo,我可以从中派生出许多其他以小方式不同的类。我有一个工厂,它创建派生类并返回Foo *。我的一个更大问题是我的运算符重载,我需要确保DFoo不会被DFoo1操作(未显示)。我目前正在处理此问题,检查演员是否失败,但我对这种方法非常不满意。我必须使用基本实现,因为我只能从工厂返回基类。如果这是最好的方法,那很好,我只是想确保这是有道理的,并且没有我缺少的模式。关于如何处理这类事情的任何建议都非常感谢。
class Foo
{
public:
Foo(int x){...};
Bar m_bar;
virtual Foo& operator=(const Foo& f)
{
m_bar = f.m_bar
}
}
现在,我的派生类
class DFoo : public Foo
{
DFoo(int x, int y):Foo(int x) {...}
FooBar m_foobar;
Foo& operator=(const Foo& rhs)
{
if(this != &rhs)
{
Foo::operator=(rhs);
DFoo temp = static_cast<DFoo>(rhs);
if(temp != NULL)
{
m_foobar = static_cast<DFoo>(rhs).m_foobar;
}
else
throw exception(ex);
}
}
}
答案 0 :(得分:1)
您可能正在寻找boost::noncopyable。
答案 1 :(得分:1)
在这种情况下最明智的做法是声明赋值运算符和复制构造函数但不定义它们。然后,如果代码中某处某人尝试复制,则会生成链接器错误。这本质上就是boost :: nocopyable的效果,除了你没有为这么简单而琐碎的任务引入外部库。
编辑:此外,如果您将构造函数和运算符设为私有,则会出现编译器错误。
答案 2 :(得分:1)
你永远不应该这样做:
class DFoo
{
Foo& operator=(const Foo& rhs) ;
};
除非您明确希望支持将基类分配给派生类型(不太可能) assignemtn运算符应该如下所示:
class DFoo
{
DFoo& operator=(DFoo const& rhs); // You can only assign DFoo to a DFoo.
// Now there is no way for DFoo1 to get assigned to a DFoo
};
同样在这个简单的示例中,您发布了编译器生成的默认assignent运算符应该按预期工作。您是否正在编写赋值运算符?