如何从类链接列表中显示类作为模板类型?

时间:2015-02-21 04:59:43

标签: c++ linked-list

所以我有以下课程:

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> variableMessage 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运算符,但我不知道应该在哪里使用它。

以下是显示功能:

<<

有什么建议吗?

1 个答案:

答案 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