2013-12-16 71 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

相關問題