c++ - 将成员动态添加到 C++ 类的解决方法

标签 c++ oop


我想知道你会如何解决这样的问题:

我有一个类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 命令使用每一个。然而,这样的更改会传播到我所有的代码,并会迫使我为使用 Foo1Foo2 的每个类创建两个不同的版本(例如,我必须创建 FooContainer1FooContainer2)。

一种侵入性较小的方法是创建

class Bar: public Foo, public Decorator1, public Decorator2
{   }

并使用它代替 Foo。在这种情况下,我只会从 Decorator1Decorator2 调用我需要的函数,而忽略其他函数,但这似乎有悖于良好的 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/

相关文章:

c++ - 在用 delete 释放的对象的析构函数中使用 free

c++ - 如何为 terrain direct x 11 C++ 正确绘制平面三角形网格

c++ - 直接减去两个 vector<point2f>

c++ - 为什么VS Debug版本将变量分配得这么远?

python子类化multiprocessing.Process

javascript - 在javascript中将值设置为__proto_ _` and `原型(prototype)

PHP继承方法引用

python - 使用继承重构一个巨大的Python类来进行组合

c# - 坚持对象创建

c++ - 从 C++ DLL 调用 Delphi 中的回调函数