2015-09-23 51 views
-2

我正在嘗試爲涉及使用Token類創建對象並將其打印出來的類進行編程。這是我的主要方法:無法正確打印從C++中的函數返回的整數

int main(int argc, char** argv) { 

    Token tok(10, "test", 1, 2); 

    printf("%d\n", tok.type()); 
} 

這是我Token.cc文件與相關方法:

Token::Token(int t, string str, int l, int c) { 
    int tokType = t; 

    string lexStr = str; 

    int lineNum = l; 

    int charPos = c; 
} 

int Token::type() { 
    return tokType; 
} 

這是我Token.h文件:

#ifndef TOKEN_H 
#define TOKEN_H 

using namespace std; 
#include <string> 

class Token{ 
private: 

public: 

    Token(int t, string str, int l, int c); 
    ~Token(); 

    int type(); 

    int tokType; 
    string lexStr; 
    int lineNum; 
    int charPos; 
}; 

#endif 

程序編譯罰款,但是當我運行它會打印一個看似隨機的數字,例如1475212264-258154088或其他一些隨機數字。

任何想法可能會出錯?這真讓我抓狂。

感謝

+0

所以我不需要在.cc文件中重新定義'lexStr'?請照常服用 – wKavey

+0

[mcve]。你的問題缺乏必要的信息/調試工作。 –

+1

左右:http://ideone.com/1PrZZm –

回答

1

我相信,在你的構造,因爲你正在重新定義你所有的變量,你是限制其範圍的構造。這個數量也是,Token類的成員變量最終不會被設置爲傳遞給構造函數的值。所以你最終得到未初始化的數據是type()的結果。

剛剛嘗試在構造函數中刪除數據類型,像這樣:

Token::Token(int t, string str, int l, int c) { 
    tokType = t; 

    lexStr = str; 

    lineNum = l; 

    charPos = c; 
} 

,看看有沒有幫助。

+1

正確的方法是,在構造函數初始化列表中初始化數據成員。 – juanchopanza

+1

@ juanchopanza是對的。 knkp,你距離有一個正確和好的答案的一小步。現在它是正確的。 – user4581301

+0

這是一個很好的答案。它會解決這個問題。不是最好的編碼風格,但是作者再次使用printf,所以也許這是另一天的教訓。 – David