假设我有一个名为 Person 的类,它拥有三种宠物:
class Person
{
public:
accept(Pet a);
private:
Dog d; // is a Pet
Cat c; // is a Pet
Fish f; // is a Pet
}
Person::accept(Pet a)
{
// if pet is Dog, then
d = a;
// if pet is Cat, then
c = a;
// if pet is Fish, then
f = a;
};
我想这里可以使用typeid
。但是,我仍然觉得它很奇怪。
是否有某种多态性、虚函数或某种 OOP 模式可以应用?
-- 编辑--
很抱歉这里的坏例子。让我再试试:
// Usually a context contains three different resources:
class Context
{
public:
setResource(Resource *r);
private:
Buffer *b_; // is a Resource
Kernel *k_; // is a Resource
Sampler *s_; // is a Resource
};
Context::setResource(Resource *r) { // same logic as Person::accept() above }
Context::handlingBuffer() { if (b_) b_->init(); ... }
Context::run() {
if (b_ && k_) {
k_.setBuffer(b_);
k_.run();
}
}
...
在这种情况下,看起来在 Context
中添加一个 Resource *r_[3]
会使事情变得更复杂。
那么,是否可以将Resource基类的指针传递给setResource()
,它可以自动决定设置哪个资源?
最佳答案
因为你持有 Pets
值,你可以忘记多态性,只需重载 accept
成员函数:
class Person
{
public:
accept(const Dog& a) { d_ = a; }
accept(const Cat& a) { c_ = a; }
accept(const Fish& a) { f_ = a; }
private:
Dog d_; // is a Pet
Cat c_; // is a Pet
Fish f_; // is a Pet
};
关于c++ - 如何为相同类型的组合成员正确设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14497271/