我有一个类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))
答案 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;
}