所以我有以下课程:
class Message
{
private:
vector<string> messageLines;
int numLines;
public:
void setNumLines(int nLines) {numLines = nLine;);//setting number of lines in the message
bool setMessage(int lineNum, string message);//fills up the vector
ostream& writeMessage(ostream &os)// overloding << operator, displays the vector.
}
bool Message :: setMessage(int lineNum, string message)
{
if (lineNum > 0)
{
messageLines.push_back(message);
return true;
}
}
ostream& Message:: writeMessage(ostream &os)
{
for (int i = 0 ; i < messageLines.size() ; i++)
{
os << messageLines[i] << endl;
}
return os;
}
从我的主要文件中,在我声明LinkedList<Message> variable
和Message messageVar
填充向量后,我将Message
变量插入到这样的链接列表中:
variable.insert(messageVar);
以下是我的主要内容的示例:
int main()
{
LinkedList<message> variable;
for (int i = 0 ; i < 5 ; i++)
{
Message messageVariable;
messageVariable.setMessage(1, "random strings")
variable.insert(messageVariable) // filling up the list with 5 random strings
}
}
但是,当我尝试调用链表的显示功能并尝试显示字符串值时,我意识到显示功能中的cout << currPtr->getItem()
将不起作用,因为我正在显示{ {1}}键入而不是字符串。我知道我应该使用我编写的类中的重载Message
运算符,但我不知道应该在哪里使用它。
以下是显示功能:
<<
有什么建议吗?
答案 0 :(得分:1)
您可以在operator<<
Message
friend ostream& operator<<(ostream& os, const Message& rhs)
{
return rhs.writeMessage(os);
}
或者,您可以尝试直接致电writeMessage
中的display()
,例如:
currPtr->getItem().writeMessage(std::cout) << std::endl; // less elegant
PS:
ostream& writeMessage(ostream &os)// overloding << operator, displays the vector.
不会重载operator<<
,但它只是一个辅助函数。你真的不需要它;如果你有一个类层次结构,你可以在其中标记virtual
并在operator<<
内调用它,这是一个好主意。这样,您就可以通过非虚拟(在本例中为非成员)函数进行动态绑定。这个成语称为NVI(非虚拟接口),它很有用,因为它允许您定义一个强制实现(在本例中为operator<<
),它可以在运行时调用“正确”的显示函数。所以基本上每个派生类都会覆盖writeMessage
,但基类中只定义了一个operator<<
,它“知道”调用右writeMessage
。