С ++ начинающий здесь. В настоящее время я пытаюсь написать программу с использованием шаблонных стеков, которая может обрабатывать два отдельных типа данных, объекты int и Student. Хотя логика стека программы работает нормально, я не уверен, как распечатать значение в верхней части стека для каждого типа данных. Прямо сейчас у меня есть две возможные идеи, перегрузить<<‘оператор для класса (который, я не уверен) или написать перегруженные функции для 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 stackpublic:
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;
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&
Перегрузки.
Других решений пока нет …