如何从模板类型为 class 的链表中显示?

How to display from a linked list with a class as template type?

所以我有以下 class:

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() 将不起作用,因为我正在显示 Message 类型而不是字符串。我知道我应该使用我写的 class 中的重载 << 运算符,但我不知道应该在哪里使用它。

这里是显示函数以防万一:

template<class ItemType>
void LinkedList<ItemType>::display() const
{
    Node<ItemType>* currPtr = headPtr;//The Node<ITemType> is in another header file
    while (currPtr->getNext() != headPtr)                   
    {
        cout << currPtr->getItem() << endl; // cout can't display Message type
        currPtr = currPtr->getNext();       
    }
    cout << endl << endl;
}

有什么建议吗?

您可以在 Message

中重载 operator<<
friend ostream& operator<<(ostream& os, const Message& rhs)
{
    return rhs.writeMessage(os);
}

或者,你可以尝试在display()中直接调用writeMessage,例如:

currPtr->getItem().writeMessage(std::cout) << std::endl; // less elegant

PS:

ostream& writeMessage(ostream &os)// overloding << operator, displays the vector.

没有重载 operator<<,它只是一个辅助函数。你在这里真的不需要它;如果你有一个 class 层次结构,在其中标记它 virtual 并在 operator<< 中调用它,那么拥有这样一个函数是个好主意。这样,您就可以通过非虚拟(在本例中为非成员)函数进行动态绑定。这个习语叫做 NVI(非虚拟接口),它很有用,因为它可以让你定义一个强制实现(在本例中 operator<<),它可以在 [=39] 调用 "right" 显示函数=]-时间。所以基本上每个派生的class都覆盖了writeMessage,但是只有一个operator<<定义在基class里面"knows"去调用右边的writeMessage .