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

Posted

技术标签:

【中文标题】错误:类中没有声明成员函数【英文标题】:error: no member function declared in class 【发布时间】:2017-01-26 23:55:57 【问题描述】:

我的代码中不断出现以下错误:

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

【问题讨论】:

您应该阅读范围规则。这可能是一个不错的起点:en.cppreference.com/w/cpp/language/scope 编译器完全正确。 Person 中没有任何地方声明了 Modify_Person 方法。在Person 之外,是的。就在它的正下方。有点太晚了,很遗憾。 感谢@TallChuck 和@user4581301! 【参考方案1】:

您不能在 C++ 中的类之外声明成员函数。要解决此问题,请在您的类中添加相应的成员函数声明:

class Person
...
public:
string Modify_Person(Person);
;

那么你的代码就可以工作了。另外,一个建议:如果构造函数和析构函数为空,则不要定义它们;允许编译器为您生成它们。如果您打算通过这样做禁用移动构造函数等,请编写 Person() = default; 让编译器生成默认实现。

【讨论】:

【参考方案2】:

功能

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();

【讨论】:

以上是关于错误:类中没有声明成员函数的主要内容,如果未能解决你的问题,请参考以下文章

使用“接口”时在类中没有声明成员函数

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]

类中成员声明的重新排序规则

错误 C2248:“CObject::CObject”:当我在 MFC 中调用 hDC.SelectObject 函数时,无法访问在“CObject”类中声明的私有成员

如何使用模板声明成员函数? (不是模板类)

关于类中静态成员函数和静态成员变量的知识点