枚举类型打印出相应的int

时间:2015-07-09 23:50:49

标签: c++ enums

我有一个类myData,它将枚举类型ADT数据传递给另一个类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); } 以存储在队列中。代码的每个方面都可以正常工作,除非我在实际出列之前尝试打印出已出列的内容。而不是打印出实际出列的内容,而是从switch语句中得到它的整数对应值。除了这个错误,程序运行正常。 以下是我的代码。

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 ADT::ADT(int oSize, int sSize) : queueSize(oSize), stackSize(sSize), top(-1), rear(-1), front(-1) { queueArr = new myData[queueSize]; stackArr = new myData[stackSize]; } 班级

的朋友

在采用myData Enum类型的堆栈和Queue类中,我有以下方法:

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;
    }
}

此方法应从队列中排队,但如果Queue为空则失败。

bool ADT::PushShelf(myData aData)
{
    if (IsShelfFull())
        return false;
    else
    {
        top++;
        stackArray[top] = aData;
    }
    return true;
}

这是为了将单个枚举类型数据(myData)压入堆栈,但如果堆栈满,则返回false。

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;
}

这段代码应该查看并返回队列中的front元素,然后进入堆栈。

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.
}

当我运行这样的代码时:

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;
}

myData type

然后我偷看了stackArr以返回myData Enum类型,然后用于初始化TakeEnum::SetData()内的GetData()个私有数据。因此,std::cout << myDataString(takeEnumObj.GetData())将始终有一个传递给MyDataString函数。 library('dplyr') tbl %>% group_by(var1) %>% filter(!all(var2 == 0))

2 个答案:

答案 0 :(得分:0)

TakeEnum::TakeEnum()
{

}

没有将type设置为任何内容,所以

TakeEnum takeEnumObj;

未定义type

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

只能通过运气不好打印出可用的输出。

cout << takeEnumObj

解析为打印type的数值,这是一些未定义的值,在这种情况下为-858993460。

至于打印出枚举值的名称,抱歉。不能这样做。

cout << PeekQueue();

只会打印数值。当你,程序员,得到一个漂亮的漂亮字符串,计算机只看到一个数字。您需要使用myDataString函数来恢复名称或创建一个镜像枚举值的字符串数组。

答案 1 :(得分: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