错误:没有在类中声明的成员函数

时间:2017-01-26 23:55:57

标签: c++ class

我不断从代码中收到以下错误:

(第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;
}

2 个答案:

答案 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();
}

有以下问题。

  1. 使用string Person::Modify_Person(Person example) { ... }定义函数仅在Modify_Person被声明为类的成员函数时才有效。既然如此,那么你只需要一个全局函数。

    string Modify_Person(Person example) {
    ...
    }
    
  2. 该函数无法修改调用函数中的对象,因为参数是通过值传递的。无论你对example做了什么,用于调用函数的对象的值在调用函数中保持不变。如果您希望看到对example所做的任何更改在调用函数中可见,则需要通过引用接受该参数。

    //                         |
    //                         v
    string Modify_Person(Person& example) {
    ...
    }
    
  3. 该行

    example.getName()="Jessica";
    
    函数中的

    不会修改example的名称。这相当于说:

    string temp = example.getName();
    temp = "Jessica";
    

    因此,下面的行返回example的名称只会返回example的名称,而不是"Jessica",我认为这与您的期望相反。

    该行需要更改为:

    example.setName("Jessica");
    
  4. 这里的功能应该是什么样的:

    string Modify_Person(Person& example) {
       example.setName("Jessica");
       return example.getName();
    }