Почему этот код говорит, что мне нужен класс / структура / объединение? - PullRequest
0 голосов
/ 18 марта 2011

Я программировал на 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 должен быть класс / структура / объединение

Ответы [ 5 ]

2 голосов
/ 18 марта 2011

me - это указатель на a Human - поэтому вам нужно использовать ->

cout ожидает, что вы используете оператор <<.

main должен возвращать не void, а int.

всегда delete что вы new

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 автоматически уничтожается, когда выходит из области видимости, в конце '}' в main.

1 голос
/ 18 марта 2011

Должно быть -

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

me - указатель на объект. Таким образом, к его членам должен обращаться оператор ->.


Также обратите внимание, что функция Human::setAge() ничего не делает.

0 голосов
/ 12 августа 2013

объект «я» на самом деле является указателем, поэтому вам нужно будет использовать стрелку вместо точки.

me->getname();

исправит ошибку.

0 голосов
/ 18 марта 2011

Другие решили прямую проблему, о которой вы спрашивали.Если вы меня потворствуете, позвольте мне обратиться к одной из проблем.

Вот то, с чего вы начали.

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 голосов
/ 18 марта 2011

Вы объявили меня указателем. Либо удалите * в объявлении, либо Используйте me->GetName() и т. Д., Чтобы использовать его.

= = = edit = = =

Поскольку конструктор по умолчанию отсутствует, * должен остаться. Либо это, либо измените его на

Human me(27, "name", true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...