在使用静态成员函数操作静态成员时需要现将静态成员初始化,否则会出现该问题。
#include"iostream"
#include"string.h"
using namespace std;
class Stu;
class Teac
{
Stu *s;
public:
Teac(int n);
void assign(int n);
void show(int n);
};
class Stu
{
int Daily_Score;
int Exam_Grade;
static float Prop;
public:
Stu(int d=0,int e=0)
{
Daily_Score = d;
Exam_Grade = e;
//Prop = p;
}
Stu(const Stu &s)
{
Exam_Grade = s.Exam_Grade;
Daily_Score = s.Daily_Score;
//Prop = s.Prop;
}
friend void Teac::assign(int n);
static void setProp(float p) { Prop = p; }
float compScore()
{
return (Prop * Daily_Score + (1 - Prop) * Exam_Grade);
}
};
Teac::Teac(int n)
{
s = new Stu;
}
// void Stu::setProp(float p)//注意静态函数没有this指针,若类外定义则不加static修饰符
// {
// Prop = p;
// }
void Teac::assign(int n)//这一条语句一定要在friend之后,否则还是不能访问
{
cin >> s[n].Daily_Score >> s[n].Exam_Grade;
}
void Teac::show(int n)
{
cout << s[n].compScore();
}
//float Stu::Prop = 0;//通过静态函数操作静态数据成员之前一定要现初始化静态成员
int main()
{
float p;
cin >> p;
Stu::setProp(p);
int n;
cin >> n;
Teac t(n);
for (int i = 0; i < n;i++)
t.assign(i);
for (int i = 0; i < n;i++)
{
t.show(i);
cout << ' ';
}
return 0;
}
55行处的静态成员没有分配存储空间,因此会报错
undefined reference to `Stu::Prop’
collect2.exe: error: ld returned 1 exit status
解决办法:取消55行处注释。