在學習C++的類的靜態數據成員的時候遇見了無法解析外部符號的問題:
LNK2001:無法解析的外部符號 "private: static int Point::count"
我在一個Point類中設置了一個私有靜態數據成員static int count;用於記錄總的點數,另外設置了一個
static void pointNum()//訪問靜態類
{
cout << "一共有" << count << "個點" << endl;
}
函數用於訪問靜態數據類成員,但是在鏈接過程中就出現了上述的問題,其問題代碼如下:
#include<iostream>
using namespace std;
class Point {//Point類
public:
Point(int x, int y) :x(x), y(y) //構造函數,當構造一個Point類時,計數器count加1
{
count++;
}
Point(const Point &p)//複製構造函數
{
x = p.x;
y = p.y;
count++;
}
int getX() { return x; }//訪問x,y座標的接口函數
int getY() { return y; }
~Point() { count--; }//析構函數,Point的對象析構時,計數器減一
static void pointNum() { cout << "一共有" << count << "個點" << endl; }//訪問靜態類數據成員的函數,輸出總共點的個數
private:
int x, y;//Point點的x,y座標
static int count;//靜態類數據成員,記錄總的點數
};
void main()
{
Point p1(2, 5);
Point p2(p1);
Point::pointNum();
}
後面經過分析發現問題在於沒有對靜態數據類成員count進行初始化,所以纔出現無法解析外部變量的錯誤。那麼,爲什麼會出現這樣的問題呢?原因在於,對於靜態類數據成員,編譯器在編譯的時候爲其在靜態內存區分配一片內存用於存儲靜態數據類型的變量,它與類中對象無關,也不受對象的影響。因此,如果未對靜態數據類型的變量進行初始化的化,那麼編譯器便不會對其分配內存,因此纔會出現外部變量無法解析的錯誤。改正這個問題的方法很簡單,只需要在main函數外部初始化這個靜態數據成員即可:
Point::count=0;//初始化靜態類數據成員
改正後的代碼如下:
#include<iostream>
using namespace std;
class Point {//Point類
public:
Point(int x, int y) :x(x), y(y) //構造函數,當構造一個Point類時,計數器count加1
{
count++;
}
Point(const Point &p)//複製構造函數
{
x = p.x;
y = p.y;
count++;
}
int getX() { return x; }//訪問x,y座標的接口函數
int getY() { return y; }
~Point() { count--; }//析構函數,Point的對象析構時,計數器減一
static void pointNum() { cout << "一共有" << count << "個點" << endl; }//訪問靜態類數據成員的函數,輸出總共點的個數
private:
int x, y;//Point點的x,y座標
static int count;//靜態類數據成員,記錄總的點數
};
int Point::count = 0;//靜態數據成員的定義和初始化
void main()
{
Point p1(2, 5);
Point p2(p1);
Point::pointNum();
}