使用C++的内置队列类在我创建的类中工作



由于某种原因,我似乎无法让C++的内置队列类在我创建的类中以相同的内置队列在main中工作的方式工作。我希望我在类中使用的队列包含我添加到其中的变量的值。但当我在类内使用内置队列时,队列似乎包含了其他内容,可能是变量的地址。

请问我做错了什么?

#include <queue>
#include <iostream>
#include <cstdlib>
using namespace std;
class Myclass {
private:
queue<int> q;
public:
Myclass();
void qPush(int n){ q.push(n); }
int qFront(){ q.front(); }
void qPop(){ q.pop(); }
};
Myclass::Myclass() { // Default Constructor
} 
int main () {
int num1 = 0; 
int num2 = 1;
queue<int> myQ; 
myQ.push(num1); 
myQ.push(num2); 
cout << myQ.front() << endl;
myQ.pop();  
cout << myQ.front() << endl;
cout << "Myclass version: " <<endl; 
Myclass b;  
b.qPush(num1);
b.qPush(num2);
cout << b.qFront() << endl;  // I want this to print out an int. But it looks like it may be printing out an address instead?
b.qPop();
cout << b.qFront() << endl;
return 0;
}

我得到的输出:

0
1
Myclass version:
537168208
537168212

问题是MyClass::qFront()没有返回语句,因此它返回一个垃圾值。

您只需要添加return语句:

int qFront(){ return q.front(); }

为了使此代码更好地工作,您还可以添加const限定符,使该方法可用于const对象:

int qFront() const { return q.front(); }

以下是一个例子,说明了为什么它可能是必要的:

Myclass a;  
a.qPush(42);
const MyClass b = a;
cout << b.qFront(); // This line results in a error if the method isn't marked as const.

这里的规则是,您应该始终将不修改对象状态的方法标记为const(如果您没有充分的理由这样做的话)。

您还可以添加此函数的第二个版本(重载),它将返回对int的引用,而不是实际的int:

int qFront() const { return q.front(); }
int &qFront() { return q.front(); }

然后第一个将用于const对象,第二个将用于可变对象。

因为它返回一个对int的引用,而不仅仅是一个普通的int,所以您可以修改返回的值:

Myclass a;  
a.qPush(42);
cout << a.qFront();
a.qFront() = 13;
cout << a.qFront();

(请注意,编译器不允许您编写int &qFront() const { return q.front(); },因为它允许您修改const对象的内容,这是一件坏事。)

最新更新