2016-10-22 78 views
1

我正在制作一个名为Magick的基于文本的冒险游戏。
在这场比赛中我有一个类标记damageSpell它看起来像这样当试图打印向量元素时,'operator <<'不匹配

class damageSpell { 
    public: 
     int damage; 
     SubClasses type; 
     int manaCost; 
     std::string spellDescription; 
}; 

我后来就用这个类作为类型的载体,像这样

std::vector<damageSpell> damageSpells

,我尝试添加通过使用矢量上的insert函数将一个元素插入到我的damageSpells向量中。

damageSpell fireball; 

user.damageSpells.insert(user.damageSpells.begin(), 0, fireball); 

然后试图将其打印出来

std::cout << user.damageSpells[0];

一旦这样做,我收到此错误

magick1.cpp:252:15: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream}’ and ‘damageSpell’)

我新的C++,而且不知道这意味着什么或如何我应该去解决它,任何和所有的帮助将不胜感激。

+0

[运算符重载](http://stackoverflow.com/questions/4421706/operator-overloading)将提供信息,特别是关于“Bitshift运算符”的选定答案部分。 – WhozCraig

+0

使用'<<'运算符输出不是自动发生的。相反,有'''运算符的特殊重载处理每个标准类型的输出。如果你想用输出操作符输出你自己的结构,你需要编写你自己定制的'operator <<'函数。几乎所有[良好的初学者书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)将教你如何做到这一点。 –

+0

你认为在矢量中放入东西会使它不可打印吗?也许忘记矢量并尝试打印'damageSpell'对象? – juanchopanza

回答

3

user.damageSpells[0]是你spellDamage类的一个实例。你的编译器不知道如何打印它。您必须定义一个函数,该函数将在<<运算符上调用并将打印出来。

此运算符重载可以定义是这样的:

std::ostream& operator<<(std::ostream& stream, const damageSpell& damageSpellToPrint) 
{ 
    // Your code here 
} 

eachtime使用之间的std::ostream(如std::cout)和你的类的实例<<操作将被调用。例如,下面的代码会直接打电话给你的操作功能,通过std::coutstream参数和user.damageSpells[0]damageSpellToPrint参数:

std::cout << user.damageSpells[0]; 

我建议你this postthis documentation,这将有助于你了解C运算符重载的概念++。

+0

好吧,我开始明白这一点,因为我创建了一个类,所以我必须创建自己的操作符,但一旦创建它,​​我将如何访问它?我会在使用新操作符后使用哪些代码 –

+0

@Alice每次在任何'std :: ostream'和类的实例之间使用'<<'时,都会调用您的操作符。 – Aracthor

+0

好吧..忘了它。那么上面那个函数里面会有什么代码呢?或者什么样的代码,而是。 –

0

您所做的事是打印整个对象,但是< <运算符没有被定义为打印任何对象,您必须自己做。 试试这个, std::cout<<user.damageSpells[0].damage<<user.damageSpells[0].manaCost

等等...... 和子太