У меня есть класс, TakeEnum
, который передает перечисление типа myData
данных другому классу ADT
для хранения в очереди. Каждый аспект кода работает отлично, за исключением тех случаев, когда я пытаюсь распечатать то, что было отменено, прежде чем на самом деле его декупить. Вместо того, чтобы распечатывать то, что было фактически отменено, я получаю его целочисленное значение из оператора switch. Программы работают отлично, за исключением этой ошибки. Ниже приведены мои коды.Тип перечисления распечатывается соответствующим int
main.cpp
enum myData{ONE, TWO, THREE};
char* myDataString(myData type)
{
char* s = "";
switch (type) {
case one:
s = "One";
break;
case two:
s = "Two";
break;
case three:
s = "Three";
break;
}
return(s);
}
Класса, который принимает тип перечисления имеет следующие определения:
TakeEnum::TakeEnum()
{
}
myData TakeEnum::GetData() const
{
return myData(type);
}
myData::TakeEnum(myDatatype) : type(type)
{
}
ostream& operator<<(ostream& say, const TakeEnum& TakeEnumObj)
{
say << TakeEnumObj.GetType();
return say;
}
operator<<
является другим TakeEnum
класса
В стеке и классе Queue, который принимает тип MyData Enum, у меня есть следующие методы:
ADT::ADT(int oSize, int sSize) : queueSize(oSize), stackSize(sSize), top(-1), rear(-1), front(-1)
{
queueArr = new myData[queueSize];
stackArr = new myData[stackSize];
}
Вставка данные типа перечисления в очередь.
bool ADT::Enqueue(myData type)
{
if (IsQueueFull())
return false;
else if (IsQueueEmpty())
{
front = 0;
rear = 0;
}
else
rear++;
queueArr[rear] = type;
return true;
}
Этот метод возвращает элемент перед очередью.
myData ADT::PeekQueue()
{
if (!IsQueueEmpty())
return queueArr[front];
/*else
return NULL;*/
}
Этот метод должен стоять в очереди из очереди, но сбой, если очередь пуста.
void ADT::Dequeue()
{
if (IsQueueEmpty())
return;
else
{
if (front == rear)
front = rear = -1;
else if (front == queueSize && rear == queueSize)
front = 0;
else
front++;
return;
}
}
Это должно подтолкнуть данные одного типа перечисления (MyData) в стек, но возвращать ложь, если стек, если полный.
bool ADT::PushShelf(myData aData)
{
if (IsShelfFull())
return false;
else
{
top++;
stackArray[top] = aData;
}
return true;
}
Этот фрагмент кода должен заглядывать и возвращать передний элемент в очередь, а затем вставлять в стек.
int ADT::InsertToStack()
{
int i = 0;
if (IsQueueEmpty())
return i;
if (IsStackFull())
{
cout << "Your stack is full.\n";
return i;
}
while ((!IsQueueEmpty()) && (!IsStackFull()))
{
PushShelf(PeekOrder());
cout << PeekQueue()";
Dequeue();
i++;
}
return i;
}
Когда я запускаю код, как это:
int main()
{
ADT adt(10, 30);
adt.Enqueue(one);
adt.Enqueue(two);
adt.Enqueue(three);
adt.InsertToStack(); //This should cout one, but I get 1
adt.InsertToStack(); //This should cout two, but I get 2
adt.InsertToStack(); //This should cout three, but I get 3
TakeEnum takeEnumObj;
std::cout << myDataString(takeEnumObj.GetData()) ; //Nothing is displayed here
cout << takeEnumObj; //overload from TakeEnum class, I get -858993460. I expect to have an enum data.
}
Примечание: Это задание.
Update:
Я был в состоянии решить эту проблему, выполнив следующие действия:
изменил
ostream& operator<<(ostream& say, const TakeEnum& TakeEnumObj)
{
say << TakeEnumObj.GetType();
return say;
}
в
ostream& operator<<(ostream& say, const TakeEnum& TakeEnumObj)
{
say << myDataString(TakeEnumObj.GetData());
return say;
}
Тогда я заглянула в stackArr вернуть MyData Тип перечисления, который затем используется для инициализации myData type
частный d ata внутри TakeEnum::SetData()
. Поэтому GetData()
всегда будет иметь возможность перейти в функцию MyDataString.std::cout << myDataString(takeEnumObj.GetData())
Я полагаю, 'оператор <<' и 'main' определены в разных файлах, не так ли? Является ли выражение 'operator <<' видимым с 'main'? Как это объявляется *? Вы пытались выполнить свой код с помощью отладчика? – n0rd
'operator <<' является другом класса 'TakeEnum' – hello
@ooga Да ...... – hello