错误:类中没有声明成员函数
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”类中声明的私有成员