2017-01-09 5 views
-3

何らかの理由で、C++の組み込みキュークラスが、同じビルド方法で作成したクラス内で動作しないようです-in待ち行列はメインで動作します。クラスに使用するキューに、変数に追加する変数の値を格納します。しかし、クラス内で組み込みのキューを使用すると、キューには代わりに何か他のものが含まれている可能性があります。おそらく変数のアドレスです。作成したクラス内でC++の組み込みキュークラスを使用して作成する

私は何を間違えていますか?

#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 
+6

あなたは 'MyClass :: qFront'から何も返されません。 –

+1

私はあなたのコンパイラがこれについてあなたに警告しなかったことに驚いています。 – AndyG

答えて

1

問題はMyClass::qFront()がreturn文を持っていないということで、なぜならそれはゴミ値を返すことの。

int qFront() const { return q.front(); } 
:あなたはまた、constのオブジェクトとメソッドを使用可能にするために const修飾子を追加することができ

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

が良く、このコードを動作させるために:

あなただけreturnステートメントを追加する必要があります

これはなぜ必要なのかを示す例です:

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オブジェクトとのために使用されます2番目は変更可能なものに使用されます。

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

(それはあなたをできるようになるので、あなたはint &qFront() const { return q.front(); }を書くことができないであろうと、コンパイラに注意してください。それだけではなく、単なるintのintへの参照を返すので

は、あなたが戻り値を修正することができますconstオブジェクトの内容を変更するのは悪いことです)。

+1

'int qFront(){return q.front(); } 'は完璧です。 – HolyBlackCat

+0

@HolyBlackCat彼のコードでよく見えます。 'return'ステートメントがありません。これを下げてください。 – nikau6

+0

@HolyBlackCatそして参照とconst参照は 'std :: queue :: front()'を最大限に利用することを許しています。 – nikau6

関連する問題