2013-12-16 76 views
1

我对这个问题输出结果感到困惑:为什么我无法为类实例设置成员值?

我今年10岁。我的名字是

为什么在“我的名字是”之后有空字符串?

#include <iostream> 

using namespace std; 

class Name { 
    int first_name; 
    int last_name; 

public: 
    void setName(int f, int l) { 
     first_name = f; 
     last_name = l; 
    } 

    int true_name(){ 
     first_name + last_name; 
    } 
}; 

class Persion { 

public: 
    int age; 
    Name name; 

    Persion(){ 

    } 

public: 
    void hello(void){ 
     cout << "I am "; 
     cout << age; 
     cout << " years old."; 
     cout << " My name is " + name.true_name() << endl; 
    } 
}; 

int main() 
{ 
    Persion a; 
    Name name; 
    name.setName(10, 2); 
    a.age = 10; 
    a.name = name; 
    a.hello(); 
    return 0; 
} 
+0

您在'true_name'中缺少'return'语句。我想编译器至少会提醒你。 –

+0

谢谢@KarlBielefeldt – qichunren

回答

5

这里有几个问题。

int true_name(){ 
    first_name + last_name; 
} 

意味着“添加FIRST_NAME和姓氏,丢弃的结果(因为你既没有退回,也没有它赋值给一个变量),然后返回一些随机的结果(可能是无论发生在最近一次是在适当的CPU寄存器) “。

你的编译器应该给你警告消息解释这一点。例如,GCC提供了以下警告:

warning: statement has no effect 
warning: control reaches end of non-void function 

确保警告你的编译器启用(例如,GCC,使用命令行-Wall),并注意警告。

你应该使用这样的事情:

int true_name(){ 
    return first_name + last_name; 
} 

接下来的问题是在这条线:

cout << " My name is " + name.true_name() << endl; 

“我的名字叫”是const char *(字符指针数组,而不是一个std::string类实例),并且向指针添加整数意味着索引该指针。在这种情况下,您说“将true_name()字符放入”我的名字是“并从那里开始打印。”代之以:

cout << " My name is " << name.true_name() << endl; 

此外,它是“人”,而不是“Persion”。

+0

非常感谢。我应该声明“姓名”吗?在Person类中输入“Name * name;”或不?如何思考这一点? – qichunren

+1

@qichunren - 在C++ OO中,“名称名称”;意思是“一个人拥有一个名字并负责它,并且总是有一个名字并且只有一个名字。” “姓名*”;可以意味着一些事情; “一个人可能有或没有名字”或“一个人在其他地方有一个对某个名字的引用,但不拥有它”或“一个人拥有一个多态的名字”。 (我在这里简化了一些。)“一个人拥有一个名称并负责它,并且总是有一个名称并且只有一个名称”是你想要的,所以使用“名称名称”。 –

+0

非常感谢。你用通俗易懂的语言解释它,很直接。 – qichunren

相关问题