有關QT中宣告一個vector為全域性變數的初始化問題
阿新 • • 發佈:2019-01-23
前面說了一個簡單的int型別全域性變數,是怎麼實現的,但是對於更復雜一點的vector型別,上面的方法固然可以借鑑,但是初始化的問題應該是不一樣的。
全域性變數:在標頭檔案的類中宣告,在cpp檔案的函式體外面進行初始化。基本的套路就是這樣的
類的靜態變數必須在類外初始化,這個懂吧!
來個具體點兒的
STLView.h
class STLView
{
public:
STLView(); //宣告建構函式
bool readSTL(const QString &fname); //讀取STL資料
QVector<MyTriangle> triangleVector; //三角面的集合
static int splitString(const QString &str, char split, QVector<QString>& strArray); //是一個靜態成員函式
double triangleZMax,triangleZMin; //定義所有三角面片的z座標最大值和最小值
static bool comp(const MyTriangle &a, const MyTriangle &b);
//排序函式,按照MyTriangle.zmin的值排序;QVector序數越大,zmin越大;升序排列,,這裡必須寫成靜態成員函式
//如果存在三角形a和b的zmin相同,那麼看a和b在STL檔案中的順序,排在前面的話,最終在QVector裡面排後面
// double read();
// MyPoint lineDir,testPoint; //定義兩點直線的方向,測試點
QVector<CrossPoint> CrossPointVector; //交點容器
static QVector<QPointF> vector; //設定輪廓二維點資訊,定義一個向量儲存QPoint型別的點
static QPointF point;
static int a; //定義全域性變數
double ZLevel; //定義z平面的值
double Dist(MyPoint P1, MyPoint P2); //計算兩點距離
bool Between(MyPoint P1, MyPoint P2, MyPoint P3); //判斷point3是否在point1和point2之間
};
STLView.cpp
#include "STLView.h" #include <QFile> #include <QTextStream> #include <QDebug> #include <QtAlgorithms>//資料排序 #include <QList> int STLView::a = 11111; //int型別初始化 QPointF STLView::point = QPointF(1,1); //vector型別初始化 QVector<QPointF> STLView::vector = QVector<QPointF>(); STLView::STLView() //預設建構函式,帶有陣列的宣告必須有預設建構函式 { }
有一個問題不得不重視:
就是在給QPointF型別的vector賦初值的時候,一般的vector賦值都是用append,push_back ,但是這兩個函式呢,它們必須在函式內部使用;然而我們要在函式
外部給全域性變數vector賦值,顯然append,push_back是不管用的,所以我們呼叫了vector的建構函式,之後再在類的建構函式插入或者賦值。
最後,謝謝大連(27754587)威哥