2015-07-09 2 views
-2

У меня есть класс, 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())

+0

Я полагаю, 'оператор <<' и 'main' определены в разных файлах, не так ли? Является ли выражение 'operator <<' видимым с 'main'? Как это объявляется *? Вы пытались выполнить свой код с помощью отладчика? – n0rd

+0

'operator <<' является другом класса 'TakeEnum' – hello

+0

@ooga Да ...... – hello

ответ

0
TakeEnum::TakeEnum() 
{ 

} 

Не установлено type ни к чему, так

TakeEnum takeEnumObj; 

имеет неопределенные type и

std::cout << myDataString(takeEnumObj.GetData()) ; 

будет печатать только полезный выход на немой удачи.

cout << takeEnumObj 

решает напечатать численное значение type, которое некоторое неопределенное значение, -858993460 в этом случае.

Как распечатать имя перечислимого значения, извините. Не могу этого сделать.

cout << PeekQueue(); 

напечатает только числовое значение. Пока вы, программист, получаете хорошую симпатичную строку для работы, компьютер видит только число. Вам нужно будет использовать функцию myDataString для восстановления имени или создания массива строк, который отражает значения перечисления.

0

В соответствии с различными битами кода вы упали в редактор здесь

cout << PeekQueue()"; 

где вы ожидаете текстовые представления передней очереди - хотя, очевидно, вставленный код не компилируется.

Вы также показывают PeekQueue быть

myData ADT::PeekQueue() 
{ 
    if (!IsQueueEmpty()) 
     return queueArr[front]; 
    /*else 
     return NULL;*/ 
} 

Это возвращает myData, и так как вы не показывают перегрузку для operator<<(ostream&, myData), поэтому cout << PeekQueue() будет выводить значение перечисления.

#include <iostream> 

enum A { A1, A2 }; 
enum B { B1, B2 }; 

std::ostream& operator << (std::ostream& os, B b) 
{ 
    switch (b) { 
     case B1: os << "B1"; break; 
     case B2: os << "B2"; break; 
    } 
    return os; 
} 

int main() { 
    A a1 = A1, a2 = A2; 
    B b1 = B1, b2 = B2; 

    std::cout << a1 << ", " << a2 << ", " << b1 << ", " << b2 << "\n"; 


    return 0; 
} 

http://ideone.com/EGSazW

+0

вот моя перегрузка для '<<': 'ostream & operator << (ostream & say, const TakeEnum & TakeEnumObj) { сказать << TakeEnumObj.GetType(); return say; } ' – hello

+0

Ничто в коде, который вы отправили, не указывает на связь между' TakeEnum' и 'myData'. – kfsone

+0

Вы говорите «моя перегрузка для <<», но - см. Также http://ideone.com/C2mocF - вам нужно перегрузить его для каждого типа, который вы хотите иметь пользовательский выход. Ничто в вставленном коде не показывает, как вы ожидаете получить от 'myData' до' myDataString'. Если это не отвечает на вашу проблему, я настоятельно рекомендую вам создать MVCE, чтобы продемонстрировать вашу проблему в сжатом виде с помощью компилируемого кода, который мы можем исправить. http://stackoverflow.com/help/mcve – kfsone

Смежные вопросы