gpt4 book ai didi

c++ - 这个类有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 23:41:48 25 4
gpt4 key购买 nike

我认为问题出在 main() 中,但编译正常,但我没有得到任何输出。我想也许它没有正确初始化,因为在 Debug模式下它说
"myCharQ {item=0x0018fa00 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌoyâpú"front=-858993460 rear=-858993460 ..."

您将如何重写它以使其正确?我刚开始上课,所以任何帮助都会很有用。

下面是一个基于Array的Queue类

#include <iostream>
#include <cstdlib>
using namespace std;

const int MaxQueueSize = 10; // Queue Struct can hold up to 10 char.
typedef char ItemType; // the queue's data type is char

class CPPQueue
{
public:
CPPQueue();
ItemType item[MaxQueueSize];
void initQueue(CPPQueue q);
bool IsEmpty(CPPQueue q);
bool IsFull(CPPQueue q);
void Enqueue(CPPQueue q, ItemType newItem);
void PrintQ(const CPPQueue q);
void PrintQueueInfo(CPPQueue myQ);
ItemType Dequeue(CPPQueue q);
private:
int front, rear;
int count;
};
CPPQueue::CPPQueue()
{
int front, rear, count = 0;
}
void CPPQueue::initQueue(CPPQueue q)
{
q.front = q.rear = q.count = 0;
}
bool CPPQueue::IsEmpty(CPPQueue q)
{
return (q.count == 0);
}
bool CPPQueue::IsFull(CPPQueue q)
{
return (q.count == MaxQueueSize);
}
void CPPQueue::Enqueue(CPPQueue q, ItemType newItem)
{
if(q.count == MaxQueueSize)
{
cerr << "Error! Queue is full, cannot enqueue item.\n" << endl;
exit(1);
}
q.item[q.rear] = newItem;
q.rear++;
if (q.rear == MaxQueueSize)
{
q.rear = 0; // adjustment for circular queue
}
q.count++;
}
ItemType CPPQueue::Dequeue(CPPQueue q)
{
ItemType theItem;
if(q.count == 0)
{
cerr << "Error! Queue is empty, cannot dequeue item.\n" << endl;
exit(1);
}
theItem = q.item[ q.front ];
q.front++;
if (q.front == MaxQueueSize)
{
q.front = 0; // adjustment for circular queue
}
q.count--;
return theItem;
}
// Function PrintQ() prints the contents of the queue without changing
// the queue. Printing starts at the "front" index and stops before we
// get to the "rear" index. A decrementing counter controls the loop.
//
void CPPQueue::PrintQ(const CPPQueue q)
{
int i;
int qindex = q.front;
for(i = q.count; i > 0; i--)
{
cout << q.item[qindex] ;
qindex = (++qindex) % MaxQueueSize; // adjustment for circular queue
if(i > 1)
cout << ", ";
}
}
// Helper function for the main program below.
void CPPQueue::PrintQueueInfo(CPPQueue myQ)
{
cout << "The queue contains: ";
PrintQ(myQ);
cout << endl;
}
int main()
{
CPPQueue myCharQ;// queue holds characters
char ch; // char dequeued
myCharQ.initQueue(myCharQ);
myCharQ.Enqueue(myCharQ, 'a'); myCharQ.PrintQueueInfo(myCharQ);
myCharQ.Enqueue(myCharQ, 'b'); myCharQ.PrintQueueInfo(myCharQ);
myCharQ.Enqueue(myCharQ, 'c'); myCharQ.PrintQueueInfo(myCharQ);

ch = myCharQ.Dequeue(myCharQ); myCharQ.PrintQueueInfo(myCharQ);
ch = myCharQ.Dequeue(myCharQ); myCharQ.PrintQueueInfo(myCharQ);

myCharQ.Enqueue(myCharQ, 'e');
myCharQ.Enqueue(myCharQ, 'f'); myCharQ.PrintQueueInfo(myCharQ);
myCharQ.Enqueue(myCharQ, 'g'); myCharQ.PrintQueueInfo(myCharQ);
cout << endl;
// print the dequeued characters
while(!myCharQ.IsEmpty(myCharQ))
{
ch = myCharQ.Dequeue(myCharQ);
cout << ch << " ";
}
cout << endl << endl;
return 0;
}

最佳答案

您永远不会初始化成员 变量frontrearcount。通过再次声明具有相同名称的变量,您可以在构造函数中隐藏它们。删除 int 并只分配它们(尽管这不是值未正确打印的原因,稍后会详细介绍)。实际上,也不要那样做;使用初始化列表:

CPPQueue::CPPQueue() 
: front(0), rear(0), count(0)
{ }

另外,为什么你有一个initQueue函数?您已经有了一个构造函数,依靠它来初始化您的实例(这不是 C!)。

接下来,IsEmpty 等函数是非静态成员函数,但它们不对当前实例进行操作。不要将队列作为参数,如果实例为空、已满等则返回。您的代码必须像这样使用:

Queue q;
q.IsEmpty(q);

只是奇怪。您的所有成员函数都以这种方式运行。当您使用成员函数时,指向当前实例的隐式指针将作为隐藏参数 (this) 传递。因此,每次调用该函数时,它都会在调用它的实例的上下文中运行。您不需要将实例作为参数。

还要意识到,您的所有函数都按值获取参数。您将疯狂地创建这些队列的拷贝。如果修改参数,调用者将看不到它。例如:

void CPPQueue::initQueue(CPPQueue q)
{
q.front = q.rear = q.count = 0;
}

这基本上是无用的(除了不需要初始化函数这一事实)。对 q.frontq.rearq.count 的更改在该函数之外不可见,因为您正在操作复制。

因此,即使您的构造函数因变量阴影而损坏, 也是您在调用 initQueue 后仍未打印预期内容的原因。 您正在修改拷贝

至于您的实现,它一点也不健壮。您将底层数组公开给您类(class)的客户。这是一个坏主意。不应直接访问队列中的项目。如果我决定直接处理数组怎么办?现在你所有的状态变量都是错误的。 frontrearcount 都可能无效,因为我修改了队列的状态而没有通过您的任何函数。

甚至没有必要;我应该能够做的就是对项目进行排队和出队。就是这样。这就是队列的作用。它不是一个数组,如果我想要一个数组,我会使用一个。

因此,总而言之,开始学习一门相对复杂的语言是值得称赞的。坚持下去,不要气馁,我们都必须在某个时候学习这些东西。

编辑:我必须运行,但这是对您的一些类(class)的快速重写。我已经删除了项目类型的 typedef。为什么?这是不必要的。您不会根据某些平台或其他环境变化将其更改为另一种类型,因此 typedef 只会损害您的类的可用性。 typedef 适用于可能因某些环境原因而改变的事物(即 int32_t),但如果它们对您或您的代码的客户没有帮助,它们只是另一种阻碍。

class CPPQueue
{
public:
CPPQueue();
bool IsEmpty() const;
bool IsFull() const;
void Enqueue(char newItem);
char Dequeue();
void PrintQ() const;
void PrintQueueInfo() const;
private:
char item[MaxQueueSize];
int front
int rear;
int count;
};

CPPQueue::CPPQueue()
: front(0), rear(0), count(0) { }

bool CPPQueue::IsEmpty() const
{
// you don't actually need the this pointer
// here, but I included it to make it clear
// that you are accessing the count variable
// for the current instance of a CPPQueue
return this->count == 0;
}

我希望这可以帮助您重写类(class)的其余部分,现在开始吧。我在不应改变 CPPQueue 的内部状态的函数声明中添加了 const。搜索“const correctness”以更好地了解您为什么要这样做。祝你好运!

关于c++ - 这个类有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com