c ++新手。我目前正在尝试编写一个涉及模板化堆栈的程序,它可以处理两个独立的数据类型,int和Student对象。虽然程序的堆栈逻辑工作正常,但我不知道如何在每个数据类型的堆栈顶部打印值。现在我有两个可能的想法,重载'&lt;&lt;&lt;类的运算符(哪一个,我不确定)或为TopStack()编写重载函数(即template <> int Stack<int>::TopStack() const
)。我实现了后者,但不正确。有谁知道最有效的方法是什么?我愿意接受任何建议。
我会发布我的代码的相关部分,以便您可以看到我在说什么。
template <class DataType>
struct StackNode
{
DataType data; // data can be of any type
StackNode<DataType> *next; // point to the next node
};
template <class DataType>
class Stack
{
private:
StackNode<DataType> *top; // point to the top node of the stack
int maxSize; // maximum stack size
int numNodes; // number of nodes in the stack
public:
Stack(); // constructor, create a stack with size 10
~Stack(); // destructor
bool isEmpty() const { return (top == 0); } // check if the stack is empty
bool isFull() const { return (numNodes == maxSize); } // check if the stack is full
void Push(const DataType &elem); // push a node onto the top of the stack
void Pop(); // pop a node from the top of the stack
int TopStack() const; // return data from the top of the stack
};
struct Students
{
char lastName[20]; // student's last name
char firstName[20]; // student's first name
int IDNumber; // student ID #
Students(); // constructor
void PrintStudent(); // print a student's information
};
void Students::PrintStudent()
{
cout << "\nID# " << this->IDNumber << " - " << this->lastName << ", "
<< this->firstName << endl;
}
// in main() snippet
// if the user asks for top of stack
case 3:
if (!intStack) // I use a boolean to switch the stack being accessed
sstack.TopStack(); // Student stack
else if (intStack)
istack.TopStack(); // Int stack
break;
答案 0 :(得分:1)
int TopStack() const; // return data from the top of the stack
应该是
DataType TopStack() const; // return data from the top of the stack
因为数据类型因堆栈类型而异。
实现了类似的东西:
template<typename DataType>
DataType Stack<DataType>::TopStack() const
{
Assert(top != nullptr);
if (top == nullptr)
return DataType();
return top->data;
}
但是,你的班级std::stack<T>
没有做什么?甚至std::vector<T>
(有趣的是,通常比stack
更好的堆栈。)
使用Stack<DataType>
的代码将知道数据的类型,或者因为它正在与之交谈的变量的类型,或者它本身具有的模板参数。为您的学生班级添加operator<<
重载,这样您就可以打印它们而不会跳过任何特殊的箍。
如果您发现超载operator<<
太可怕了,您可以编写一个独立的Print
函数,int
和Student const&
重载。