我已经使用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
答案 0 :(得分:2)
me
是指向 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
会在超出范围时自动销毁,在主屏幕的最后“}”处。
答案 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();
将解决错误。