我是C ++的新手,我被困在我的程序中。这是一个模仿棋盘游戏“战舰”的程序。我们获得了编辑代码,我们被要求做的其中一件事就是让程序提示你想要放置哪种船(目前只有1艘)。
我们开始使用某个船级( Submarine ),我将其作为 Ship 父类。我计划为每种船型使用派生类,但游戏类下的功能具有原始潜艇类(&潜艇)的参数(其中现在发货,因此参数为& Ship)。我试图找出如何动态决定参数的类型,以便我可以使用放置船舶的功能。
有办法做到这一点吗?我们刚刚学习了父/子课程,还没有学过模板,这是我见过的常用方法。我也看到很多虚拟函数用于类似于我的解决方案,但我不太明白这将如何有助于我的场景。
以下是我之前谈到过的一个函数示例(在游戏类下):
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);
}
如果需要更多信息,请与我们联系!
谢谢
答案 0 :(得分:1)
您不需要模板。
我从你的问题中了解了以下内容
正确?
当您希望所考虑的类型完全没有关系时,您只需要模板。这不是这种情况。
凭借多态性,您的方法已经能够处理您想要的方法。
考虑一个简单的例子,如下所示
#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 对象。这是有效的,因为这是由类多态性本质上保证的。
只要根据船舶的类型不做不同的事情,您的方法应该有效。但是,如果是这种情况,那就更好 使用重载函数和强制转换
这也导致了一个名为Liskov Substitution Principle的OOP原则。该原则要求您对基类和派生类对象进行建模,使得派生类的对象始终可以代表基类。