2014-02-05 160 views
1

我仍然在努力学习类,但是我创建了这个,我似乎得到了一些奇怪的数字,如内存号或某些东西,我无法弄清楚什么是错的。class not working properly

#include <iostream> 
#include <string> 
using namespace std; 

class JoesClass { 
public: 
    int setAge(int age) {  
     return age; 
    } 

    void displayAge() { 
     cout << "your age is " << age << endl; 
    } 
private: 
    int age; 
}; 

int main() 
{ 
    JoesClass newobject; 
    newobject.setAge(40); 
    newobject.displayAge(); 

    return 0; 
} 

回答

6

的问题是这样的:

int setAge(int age) { 
    return age; 
} 

不设置年龄。它只是返回你给它的值,而不更新类成员。你想要更多的东西一样:

void setAge(int age) { 
    this->age = age; 
} 

你可能想改变参数的名称,因此它不会隐藏类成员:

void setAge(int new_age) { 
    age = new_age; 
} 

你也应该走出推杆的习惯using namespace std;在全局名称空间中,而是限定标准库名称,如std::cout。虽然using指令可以节省一些杂乱的内容,但是当您声明与库中的某些内容相同的名称时可能会导致问题。

+0

好的,谢谢,我现在看到它,我只是将函数中的变量更改为X. – user3275730

+2

为什么你建议使用'age = new_age;'而不是'this-> age = age;'?我发现后者更易于阅读,因为它更加明确。 – user2079303

+0

将名称改为比'X'更具描述性的名称。如果你不使用'this-> age = age;' – bblincoe

3

你只是返回调用者通过。你需要将对象的age成员变量设置为值age

void setAge(int age) 
{ 
    this->age = age; 
} 

this是用来防止变量隐藏(你的成员变量被命名为“年龄”以及参数名“年龄”)。你指的是哪个“年龄”?这就是this可用于明确声明“我想使用此对象的变量”age

你也可以用类似下面用支票来包装你displayAge方法有效的年龄:

void displayAge() 
{ 
    if (age != 0) 
    { 
    std::cout << "your age is " << age << std::endl; 
    } 
} 

,并在构造函数中给你age变量的默认值:

JoesClass() 
{ 
    this->age = 0; // Initial value is considered not a valid age 
} 

现在,当你创建你的班级时,你将拥有一个初始年龄值。

+0

返回类型应该是'void' – olevegard

+0

是的,应该是。谢谢! – bblincoe

0

但是,你不是设置age变量在setAge函数。这意味着age成员变量未初始化,并将包含看似随机的值。使用未初始化的值会导致未定义的行为

+0

有关如何解决这个问题的任何提示? –