2011-03-18 33 views
0

我已经在java和AS3和C#编程了一段时间,并决定给C++一个尝试......所以,我决定创建一个简单的程序来查看对象如何在这里工作。我有两个文件:为什么这段代码说我需要一个类/结构/联合?

Human.h

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

class Human 
{ 
    private: 
     int _age; 
     string _name; 
     bool _gender; 

    public: 
     void setAge(int); 
     void setName(string); 
     int getAge(); 
     string getName(); 
     bool getGender(); 


    Human(int age, string name, bool gender) 
    { 
     setAge(age); 
     setName(name); 
     _gender = gender; 
    } 

    ~Human() 
    { 
    } 
}; 

int Human::getAge(){ 
    return _age; 
} 

string Human::getName(){ 
    return _name; 
} 

bool Human::getGender(){ 
    return _gender; 
} 

void Human::setAge(int val){ 

} 

void Human::setName(string val){ 
    _name = val; 
} 

而且Main.cpp的

#include <iostream> 
#include "Human.h" 
#include <string> 


using namespace std; 
void main(void){ 


Human *me; 
me = new Human(27,"Mr Miyagi",true); 

cout << "My name is "+me.getName()+" and I am "+me.getAge()+" years old"; 

} 

我得到的是在 “我” 的一条红线字和错误C2228:'.getName'的左边必须有class/struct/union

回答

0

你已经声明我是一个指针。 可以删除声明上的*,或者使用me->GetName()等等来使用它。

= = = =编辑= =

由于没有默认的构造函数,该*必须保持。如果不是这样,将其更改为

Human me(27, "name", true); 
+0

谢谢!使用me-> getName()使程序运行!现在它给了我一个年龄为-8923454,但我想我可以从那里修复它;) – Loupax 2011-03-18 00:18:19

+0

@Loupax - 因为你的'setAge()'什么都不做。 – Mahesh 2011-03-18 00:19:30

+0

1st)Duh!我刚才注意到空setAge。第二)我不知道我可以创建一个对象,而不使用“新”...我想我会去买一本书或什么... – Loupax 2011-03-18 00:21:55

1

它应该是 -

​​

me是指向的对象。所以,它的成员应该由运营商->访问。


另外,还要注意Human::setAge()函数什么都不做。

2

me指针一个Human - 所以你需要使用->

cout希望你使用<<操作。

main不应该返回void,而是int。

总是deletenew

int main() { 
    Human *me; 
    me = new Human(27,"Kostas Loupasakis",true); 
    cout << "My name is " << me->getName() << " and I am " << me->getAge() << " years old"; 
    delete me; 
} 

或者,你可以不使用指针,并使用.

int main() { 
    Human me(27,"Kostas Loupasakis",true); 
    cout << "My name is " << me.getName() << " and I am " << me.getAge() << " years old"; 
} 

上面的第一个变种分配从自由存储人员,称为堆 - 类似于java。尽管你需要在C++中明确地删除。

第二个变种在堆栈上分配一个人 -java只能对原始类型(int,float)等进行此操作,C++可以对任何对象执行此操作。在这种情况下,当me超出了作用域时,会在主要的最后一个'}'处自动被破坏。

0

其他人已经解决了你问到的直接问题。如果你会放纵我,让我解决一个切题。

这是你开始的。

void main() 
{ 
    // You could combine these two lines like this: 
    // Human *me = new Human(27,"Kostas Loupasakis",true); 
    Human *me; 
    me = new Human(27,"Kostas Loupasakis",true); 

    cout << "My name is "+me->getName()+" and I am "+me->getAge()+" years old"; 
} 

我不能AS3说话,但在Java和C#,你有垃圾收集清理分配的内存。在C++中没有这样的野兽,所以你必须像这样自己清理内存。

void main() 
{ 
    Human *me = new Human(27,"Kostas Loupasakis",true); 

    cout << "My name is "+me->getName()+" and I am "+me->getAge()+" years old"; 

    delete me; 
} 

new呼叫分配堆上的Human对象,delete释放内存当你用它做。这是一个更好的方法来做到这一点。

void main() 
{ 
    Human me(27,"Kostas Loupasakis",true); 

    cout << "My name is "+me.getName()+" and I am "+me.getAge()+" years old"; 
} 

在这种情况下,Human对象的空间在堆栈中保留,而不是堆。因此,当函数退出时,空间会自动回收。此外,您可以使用.表示法而不是->表示法,因为您处理的是对象而不是指针。

我希望这会有所帮助。

+0

这是一个非常有用的信息!我不知道删除的用法,我认为我应该使用〜我什么的(还没有尝试过)。此外,ClassName实例(parameter1,2,3)表示法对我来说是新的......它是否与使用new运算符基本相同? PS:AS3既没有垃圾收集器,也没有析构函数。这是所有关于再次使用相同的对象,并再次... – Loupax 2011-03-18 08:37:35

+0

这两个机制调用相同的构造函数。不过,使用'new'会导致对象被分配到堆上,而不是堆栈。一般来说,如果可能的话,首选堆栈,特别是对于函数级别的变量。 – 2011-03-18 15:17:17

0

对象'我'实际上是一个指针,所以您将需要使用箭头而不是点。

me->getname(); 

会解决这个错误。