如何从模板类型为 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
.
所以我有以下 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
.