我不断从代码中收到以下错误:
(第58行)错误:没有在'Person'类中声明的'std :: string Person :: Modify_Person(Person)'成员函数在函数'int main()'中:
(第113行)错误:未在此范围内声明'Modify_Person'
以下是代码:
#include <iostream>
#include <string>
using namespace std;
void PassByByValue(int num2){
cout << "You are in PassByValue()" << endl;
num2++;
}
class Person{
int age;
string name;
int height;
int weight;
public:
Person(){
}
Person(string name){
this->name=name;
}
string getName(){
return this->name;
}
void setAge(int age){
this->age=age;
}
void setName(string name){
this->name=name;
}
void setHeight(int height){
this->height=height;
}
void setWeight(int weight){
this->weight=weight;
}
~Person(){
}
};
string Person::Modify_Person(Person example){
example.getName()="Jessica";
return example.getName();
}
void PassByRef(int& num3){
cout << "You are in PassByRef()" << endl;
num3=50;
cout << "inside PassByRef() pNum is: " <<num3<<endl;
}
int main()
{
int num1;
int* pNum;
num1=3;
*pNum=5;
PassByByValue(num1);
cout << "num1= " <<num1 <<endl;
PassByRef(*pNum);
cout << "outside PassByRef() in main() pNum is: " <<pNum<<endl;
PassByByValue(*pNum);
double* DblePtr;
DblePtr= new double;
*DblePtr=12.0;
cout<< "DblePtr: "<< &DblePtr;
delete[] DblePtr;
cout<< "DblePtr: "<< &DblePtr;
Person human;
human.setName("Kate");
human.setAge(27);
human.setHeight(100);
human.setWeight(100);
Modify_Person(human);
cout << "Modify_Person returns: " << Modify_Person(human) <<endl;
cout << "name should be Jessica: " << human.getName() << endl;
return 0;
}
答案 0 :(得分:3)
您无法在C ++中的类外声明成员函数。要解决此问题,请在您的类中添加相应的成员函数声明:
class Person{
...
public:
string Modify_Person(Person);
};
然后你的代码就可以了。另外,建议:如果构造函数和析构函数为空,则不要定义它们;允许编译器为您生成它们。如果您打算通过执行此操作来禁用移动构造函数等,请编写Person() = default;
以使编译器生成默认实现。
答案 1 :(得分:1)
功能
string Person::Modify_Person(Person example) {
example.getName()="Jessica";
return example.getName();
}
有以下问题。
使用string Person::Modify_Person(Person example) { ... }
定义函数仅在Modify_Person
被声明为类的成员函数时才有效。既然如此,那么你只需要一个全局函数。
string Modify_Person(Person example) {
...
}
该函数无法修改调用函数中的对象,因为参数是通过值传递的。无论你对example
做了什么,用于调用函数的对象的值在调用函数中保持不变。如果您希望看到对example
所做的任何更改在调用函数中可见,则需要通过引用接受该参数。
// |
// v
string Modify_Person(Person& example) {
...
}
该行
example.getName()="Jessica";
函数中的不会修改example
的名称。这相当于说:
string temp = example.getName();
temp = "Jessica";
因此,下面的行返回example
的名称只会返回example
的名称,而不是"Jessica"
,我认为这与您的期望相反。
该行需要更改为:
example.setName("Jessica");
这里的功能应该是什么样的:
string Modify_Person(Person& example) {
example.setName("Jessica");
return example.getName();
}