我是C++新手,我被困在我的程序中。这是一个模仿棋盘游戏"战舰"的程序。我们得到了要编辑的代码,我们被要求做的一件事是让程序提示你想放下哪种船(目前只有 1 艘船(。
我们得到了一个特定的船级(潜艇(开始,我把它变成了一个舰艇父级。我计划对每种船型使用派生类,但 Game 类下的函数具有原始潜艇类(&submarine((现在是 Ship,因此参数为 &Ship(的参数。我正在尝试弄清楚如何动态决定参数的类型,以便我可以使用放置任何船的函数。
有没有办法做到这一点?我们刚刚学习了父/子类,还没有学习模板,这是我看到的常用方法。我也看到很多虚拟函数用于类似于我的解决方案,但我不太明白这将如何帮助我的坐姿。
下面是我之前讨论过的函数示例(在 Game 类下(:
bool placePiece(Ship& piece) // Ship is parent class -- want it to be derived class (1 of 5 options) depending on which class is being used
{
cout << "What coordinate do you want to place the " << toLower(piece.getName()) << " (length "<<piece.getLength()<<") at?n";
string coordinate = toLower(requeststring());
cout << "What direction do you want the piece to go? (up, down, left or right)n";
string direction = toLower(requeststring());
piece.setPiece(rowCharToInt(getFirstChar(coordinate)), getFirstInt(coordinate)-1, getFirstChar(direction));
return isValidPlacement(playerBoard, piece);
}
如果需要更多信息,请告诉我!
谢谢
你不需要模板。
我从你的问题中了解了以下内容
你- 被赋予了潜艇级,你把它改名为船
- 您计划制作船舶的子类别,例如战列舰,潜艇等
- 您在 Game 类中有一些接受船对象的函数,并且你想要动态接受船的任何派生类。
正确?
只有当您希望要考虑的类型完全没有关系时,您才需要模板。 这里的情况并非如此。
凭借多态性,您的方法已经能够处理您想要的内容。
考虑一个简单的例子,如下所示
#include <iostream>
class Base {
public:
int a;
};
class Derived : public Base {
public:
int b;
};
void doge(Base foo) {
std::cout << "My a value: " << foo.a << std::endl;
}
int main() {
Derived d;
d.a = 5;
doge(d);
return 0;
}
请注意 doge
函数如何接受并期望 Base 对象,但我们向其发送 Derived 对象。这是有效的,因为这本质上是由类多态性保证的。
只要根据船的类型,你不做不同的事情,你的方法应该有效。但是,如果是这种情况,最好使 重载函数和强制转换的使用
这也导致了一个称为利斯科夫替换原理的OOP原理。该原则要求您对基类对象和派生类对象进行建模,以便派生类的对象始终可以代表基类。