Печать отдельных типов данных поверх двух стеков шаблонов (C ++)

С ++ начинающий здесь. В настоящее время я пытаюсь написать программу с использованием шаблонных стеков, которая может обрабатывать два отдельных типа данных, объекты 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;

0

Решение

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& Перегрузки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector