gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:05:47 25 4
gpt4 key购买 nike


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

我有一个类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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com