我想知道你会如何解决这样的问题:
我有一个类Foo
:
class Foo
{
public:
Foo() { }
~Foo() { }
float member1() { return _member1; }
private:
float _member1;
// other members etc...
}
一个容器类,其中包含指向 Foo 实例的指针容器
class FooContainer
{
public:
FooContainer() { }
~FooContainer() { }
void addFoo(Foo* f) {_foos.push_back(f);}
private:
boost::ptr_vector<Foo> _foos;
}
我的问题是:在运行时,我需要根据 GUI 的指令向 Foo“添加”新的(完全不同的)成员。我可以通过创建两个像这样的“装饰器”来解决这个问题:
class Decorator1
{
public:
int alpha() { return _alpha; }
float beta() { return _beta; }
private:
int _alpha;
float _beta;
}
class Decorator2
{
typedef std::complex<float> cmplx;
public:
cmplx gamma() { return _gamma; }
double delta() { return _delta; }
private:
cmplx _gamma;
double _delta;
}
然后我将创建两个不同的 Foo 实现:
class Foo1 : public Foo, public Decorator1
{ }
class Foo2 : public Foo, public Decorator2
{ }
并根据 GUI 命令使用每一个。然而,这样的更改会传播到我所有的代码,并会迫使我为使用 Foo1
和 Foo2
的每个类创建两个不同的版本(例如,我必须创建 FooContainer1
和 FooContainer2
)。
一种侵入性较小的方法是创建
class Bar: public Foo, public Decorator1, public Decorator2
{ }
并使用它代替 Foo
。在这种情况下,我只会从 Decorator1
和 Decorator2
调用我需要的函数,而忽略其他函数,但这似乎有悖于良好的 OOP 技术。
关于这个问题有什么建议吗?
最佳答案
为什么不使用这样简单的多态性呢?
class Foo
{
public:
Foo() { }
virtual ~Foo() { }
float member1() { return _member1; }
private:
float _member1;
// other members etc...
}
class Foo1 : public Foo
{
public:
int alpha() { return _alpha; }
float beta() { return _beta; }
private:
int _alpha;
float _beta;
}
class Foo2 : public Foo
{
typedef std::complex<float> cmplx;
public:
cmplx gamma() { return _gamma; }
double delta() { return _delta; }
private:
cmplx _gamma;
double _delta;
}
class FooContainer
{
public:
FooContainer() { }
~FooContainer() { }
void addFoo(Foo* f) {_foos.push_back(f);}
private:
boost::ptr_vector<Foo> _foos;
}
那么客户端代码不需要改变。根据 GUI 命令,您可以创建 Foo1 或 Foo2 并将其添加到单个容器中。如有必要,您可以在 Foo 指针上使用 dynamic_cast 强制转换为 Foo1 或 Foo2。但是,如果您已经正确编写了客户端代码,那么就不需要这样做了。
关于c++ - 将成员动态添加到 C++ 类的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363267/