【发布时间】:2021-01-13 12:05:19
【问题描述】:
我正在尝试做这样的事情:
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 并达到预期的结果吗?
注意:
我的实际代码非常复杂,基本上使用抽象类进行多态性并将这些抽象类作为参数传递给具有默认参数的另一个类,如果有 ANY 其他方式来做类似的事情,我将非常感激帮助。
【问题讨论】:
-
对象不是指针,指针不是对象。在 C++ 中没有办法做这样的事情。你可以使用
new,但这显然会泄漏内存。这看起来像 Java 代码,但是 C++ 不是 Java。 -
使用重载而不是默认参数
-
当你在
main()中声明Model first()时,你声明了函数first返回Model。谷歌“最令人头疼的解析”。 -
再次:你了解指针和对象的区别吗?您不能创建一个对象并将其分配给一个指针,无论是在默认参数值中,还是在其他任何地方。 C++ 不能以这种方式工作。
-
不幸的是,代码胜于雄辩,没有人能够找出甚至没有显示的代码的问题。
标签: c++ class polymorphism abstract-class default-value