为什么这段代码说我需要一个类/结构/联合?

时间:2011-03-18 00:09:11

标签: c++ compiler-errors

我已经使用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";

}

我得到的是“me”字下的红线,错误C2228:'。getName'的左边必须有class / struct / union

5 个答案:

答案 0 :(得分: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会在超出范围时自动销毁,在主屏幕的最后“}”处。

答案 1 :(得分:1)

应该是 -

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

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


另请注意,Human::setAge()函数不执行任何操作。

答案 2 :(得分:0)

您已将我声明为指针。 删除声明中的*,或使用me->GetName()等来使用它。

= = = edit = = =

由于没有默认构造函数,因此*必须保留。或者将其改为

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

答案 3 :(得分: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对象的空间保留在堆栈上而不是堆中。因此,当函数退出时,空间会自动回收。此外,您可以使用.表示法而不是->表示法,因为您正在处理对象而不是指针。

我希望这会有所帮助。

答案 4 :(得分:0)

对象'我'实际上是一个指针,所以你需要使用箭头代替点。

me->getname();

将解决错误。