我先举一个错误的例子看看我们的代码有没有相似之处:
#include<iostream>
#include<string>
using namespace std;
class student {
int m_nu;
string m_name;
public:
student() {
cout << "默认构造函数的创建" << endl;
}
student(int m, string n) :m_nu(m), m_name(n) {}
~student();
friend void xianshi(const student& p) ;
};
//student::student(int m, string n) :student(m_nu, m_name) {};
void xianshi(const student& p) {
cout << p.m_nu << ":" << p.m_name << endl;
}
void test() {
student p1;
student p2(1, "xiaoyun");
xianshi(p2);
p1 = p2;
xianshi(p1);
//xianshi(p2);
}
int main() {
test();
return 0;
}
乍一看,代码写的很完整啊,没有任何问题,构造和析构函数都已经写好了的,但是一旦运行就会出现以下的错误:
1>------ 已启动生成: 项目: c++类练习, 配置: Debug Win32 ------
1>类和动态内存分配.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall student::~student(void)" (??1student@@QAE@XZ),该符号在函数 "void __cdecl test(void)" (?test@@YAXXZ) 中被引用
1>C:\Users\Xiaoyun\source\repos\c++类练习\Debug\c++类练习.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>已完成生成项目“c++类练习.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
编译器说我的错误在于,我的析构函数被引用了。 ~~~~~~~~~~~~~这当然啦,我不引用他我写他干嘛???逗编译玩吗!!
后来我多方查证,但都没有啥好的效果,于是我转向类定义和声明的这一部分,我突然想到一件事:类中定义的东西,如果要用的话,是不是一定要先声明一下呢??? 本着实践是检验真理的唯一标准,我试了一下,对~student()写了一个声明,你猜如何,没问题了。
所以我们在写程序的时候,不要一味的觉得,我明白这个东西怎么用了,这个想法是不行的,还得动手去操作,用实践去检验自己的想法。