c++ - 抽象类指针参数的默认值

标签 c++ class polymorphism abstract-class default-value

我正在尝试做这样的事情:

class Movement {
public:
    virtual void move() = 0;
};

class Walk : public Movement {
public:
    void move() { cout << "walking"; }
};

class Run : public Movement {
public:
    void move() { cout << "run"; }
};
class Animal {
public:
    virtual void print();
};

class Human : public Animal {
public:
    void print() { cout << "Human"; }
};

class Lion : public Animal {
public:
    void print() { cout << "Lion"; }
};
class Model {
    Animal* animal;
    Movement* movement;

public:
    Model(Animal* animal = new Human(), Movement* movement = new Walk()) {
        this->animal = animal;
        this->movement = movement;
    }
    void print() {
        cout << "This Model consist of one: ";
        animal->print();
        cout << ", which is: ";
        movement->move();
    }
};
int main() {
    Model first = Model(), second = Model(new Lion(), new Run());
    first.print();
    cout << endl;
    second.print();
    return 0;
}

我们如何设置抽象类指针的默认值以及如何像从 main 那样将它们作为参数传递?

我还希望能够像这样仅在一行中传递来自 main 的参数,而无需事先进行初始化。

谁能帮我用 C++ 做这些事情吗?

我已经尝试和搜索了很多但没有运气。

我正在寻找一种变通方法来做这样的事情,其中​​我们使用抽象类作为其他类的参数。

我知道不能将对象分配给指针,我只是不知道该怎么做才能满足我的要求,抽象类作为具有默认值的参数。

这是我对精确代码的最新尝试,但不幸的是,对于 new,有谁知道如何摆脱 new 并达到预期的结果?

注意:
我的实际代码非常复杂,基本上使用抽象类进行多态性并将这些抽象类作为参数传递给具有默认参数的另一个类,如果有任何其他方法来做类似的事情我真的很感激帮助。

最佳答案

这确实是一个设计问题。在 Model 类设计中,您要么需要决定对象所有权,要么将决定权推迟到调用代码。在后一种情况下,您不能使用默认参数(除非您希望使用全局常量 HumanWalk,但我不推荐这样做)。

获得默认参数的一种方法是确定 Model 拥有 AnimalMovement 的独占所有权,并存储 unique_ptr 给他们。像这样:

class Model {
    unique_ptr<Animal> animal;
    unique_ptr<Movement> movement;

public:
  Model(unique_ptr<Animal> animal = make_unique<Human>(), unique_ptr<Movement> movement = make_unique<Walk>()){ 
    this->animal = std::move(animal);
    this->movement = std::move(movement);
  }
  void print() {
    cout << "This Model consist of one: ";
    animal->print();
    cout << ", which is: ";
    movement->move();
  }
};

int main() {
  Model first/*no () here!*/, second(make_unique<Lion>(), make_unique<Run>()); 
  first.print();
  cout << endl;
  second.print();
  return 0;
}

关于c++ - 抽象类指针参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64093159/

相关文章:

JavaScript 字符串替换函数丢失类对象

C++虚拟模板函数

android - 在加载 Android 应用程序时获取 ClassNotFoundException

c++ - 唯一指针和 3 法则

Java - 具有相同方法的不同对象的数组

c++ - Qt在不同操作系统下如何处理不同的事件序列?

c++ - 使用 constexpr yield 递减吗?

c++ - 表达式无法识别函数c++中的指针

c++ - 纹理无法呈现 - DirectX 9

javascript - CoffeeScript 类中是否可以有同名的静态函数和成员函数?