2015-09-23 21 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