c++ - 如何为相同类型的组合成员正确设置值

标签 c++ design-patterns polymorphism

假设我有一个名为 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/

相关文章:

c++ - 如何获取新的数组值? C++

ruby-on-rails - 在 Ruby on Rails 中实现复合模式

java - 动态转换为子类以使用正确的方法重载

java - 静态方法或父类(super class)

android - 谷歌地图中使用的模式名称 > 滚动后的 Activity 变为全屏 Activity

class - 使用类引用进行多态和继承(第2部分)?

c++ - 如何检查多态子类的模板参数类型

c++ - 如何修复( 'vector' : undeclared identifier ) in my header file?

c++ - 如何使对模板函数的调用不那么冗长

c++ - 依赖范围和嵌套模板