Class 变量无法通过 class 方法访问
Class variable not reachable from class method
我正在尝试实现循环队列。
我已经在头文件中声明了队列的大小,并且我通过构造函数使用大小变量启动了我的队列。
这里有 queue.h 和 queue.cpp 个文件。
class Queue
{
public:
int size;
int front, rear;
int A[];
Queue(int size);
bool isEmpty();
void enqueue(int n);
int dequeue();
int Peek();
void Display();
int sizeQ();
};
这里是queue.cpp
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
bool Queue::isEmpty(){
if((front == -1) && (rear == -1))
return true;
else
return false;
}
void Queue::Display(){
if(isEmpty()){
cout << "Its empty! Nothing to display"<<endl;
}else{
for(int i=0; i<sizeQ(); i++){
cout << A[i] << endl;
}
}
cout <<endl;
}
这是我的主要
int main()
{
Queue q1(10);
q1.enqueue(20);
q1.Display();
return 0;
}
问题:尽管我在 main 中使用 size 创建了对象,但在 display 函数中循环看不到 size 变量。当我调试程序时,我看到大小为 0,因此 for 循环永远不会开始。
我试过的
int Queue::sizeQ(){
return size;
}
我尝试 return 通过方法调整尺寸;然而,没有运气。我应该怎么做才能访问大小变量?
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
您永远不会在此处初始化 this->size
。因此 sizeQ()
returns size
成员的未初始化值。
在构造函数中添加this->size = size;
。
编辑:int A[size]
并不像您认为的那样。它正在创建一个本地数组,与成员 A
无关。请参阅@jignatius 的回答以了解如何修复它。
在构造函数内部启动大小如下:
Queue::Queue(int nSize) //changed name of parameter to nSize to remove confusion
{
int A[size];
front = rear = -1;
size = nSize; // Initialize passed param to member variable of class
}
目前您的构造函数创建了一个本地数组,该数组在完成后被销毁。你不想这样做。
如果要在 运行 时设置数组的大小,则必须在堆上声明它。为此,您应该在 header:
中像这样更改数组 A 的声明
int *A;
然后在你的构造函数中你可以在堆上分配数组:
Queue::Queue(int iSize):
size(iSize), front(-1), rear(-1)
{
A = new int[size];
}
注意初始化列表正在初始化成员变量 size,front 和 rear。
您还必须取消分配数组。为此,请将析构函数添加到您的 class Queue 并执行此操作:
Queue::~Queue()
{
delete [] A;
}
这将释放 A 使用的内存。
我正在尝试实现循环队列。
我已经在头文件中声明了队列的大小,并且我通过构造函数使用大小变量启动了我的队列。
这里有 queue.h 和 queue.cpp 个文件。
class Queue
{
public:
int size;
int front, rear;
int A[];
Queue(int size);
bool isEmpty();
void enqueue(int n);
int dequeue();
int Peek();
void Display();
int sizeQ();
};
这里是queue.cpp
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
bool Queue::isEmpty(){
if((front == -1) && (rear == -1))
return true;
else
return false;
}
void Queue::Display(){
if(isEmpty()){
cout << "Its empty! Nothing to display"<<endl;
}else{
for(int i=0; i<sizeQ(); i++){
cout << A[i] << endl;
}
}
cout <<endl;
}
这是我的主要
int main()
{
Queue q1(10);
q1.enqueue(20);
q1.Display();
return 0;
}
问题:尽管我在 main 中使用 size 创建了对象,但在 display 函数中循环看不到 size 变量。当我调试程序时,我看到大小为 0,因此 for 循环永远不会开始。
我试过的
int Queue::sizeQ(){
return size;
}
我尝试 return 通过方法调整尺寸;然而,没有运气。我应该怎么做才能访问大小变量?
Queue::Queue(int size)
{
int A[size];
front = rear = -1;
}
您永远不会在此处初始化 this->size
。因此 sizeQ()
returns size
成员的未初始化值。
在构造函数中添加this->size = size;
。
编辑:int A[size]
并不像您认为的那样。它正在创建一个本地数组,与成员 A
无关。请参阅@jignatius 的回答以了解如何修复它。
在构造函数内部启动大小如下:
Queue::Queue(int nSize) //changed name of parameter to nSize to remove confusion
{
int A[size];
front = rear = -1;
size = nSize; // Initialize passed param to member variable of class
}
目前您的构造函数创建了一个本地数组,该数组在完成后被销毁。你不想这样做。
如果要在 运行 时设置数组的大小,则必须在堆上声明它。为此,您应该在 header:
中像这样更改数组 A 的声明int *A;
然后在你的构造函数中你可以在堆上分配数组:
Queue::Queue(int iSize):
size(iSize), front(-1), rear(-1)
{
A = new int[size];
}
注意初始化列表正在初始化成员变量 size,front 和 rear。
您还必须取消分配数组。为此,请将析构函数添加到您的 class Queue 并执行此操作:
Queue::~Queue()
{
delete [] A;
}
这将释放 A 使用的内存。