![](/img/trans.png)
[英]How can I Declare/define/initialize a static member variable of template classes as static member variables of a class?
[英]Can I declare and define static class variable in a same .CPP file?
在我的.cpp文件中,我有一個類的聲明和定義。嘗試使用建議的一種方式初始化字符串數組時會出錯。
class week
{
public:
week();
static const char * const days[];
}
week::week()
{
const char * const week::days = {"monday" , "tuesday" "etc..."}
}
我得到有效天數變量的重新定義錯誤。 但是我想對上述代碼進行什么更改才能在同一.cpp文件中工作。
在這里,我沒有使用頭文件來聲明類。 類聲明和定義都位於SAME .cpp文件中。
謝謝
在C ++文件中,您應該編寫
const char * const week::days[] = {"monday", ...};
// ^^ <- don't forget these
它應該在全局范圍內,而不是在構造函數中。 構造函數應該與靜態成員初始化無關。
您將需要執行以下操作:
class week
{
public:
week();
static const char * const days[];
};
week::week()
{
}
const char * const week::days[] = {"monday" , "tuesday", "etc..."};
void main()
{
week w;
}
更新:
看看我糾正的一些錯誤:
;
在課程結束時 days
的初始化轉移到類外 ,並增加了一個;
以及初始化語句。 靜態變量在全局范圍內初始化(在類定義之后)。 構造函數僅用於初始化當前對象實例的成員變量。
關於將所有代碼都放在同一個(.cpp)文件中的問題,答案是肯定的。 您可以將所有代碼放在同一個文件中並對其進行編譯,它將起作用。
但是,不建議這樣做。
按照約定,頭文件(.h)包含聲明,而(.cpp)包含定義。
因此,重構上面的代碼,我得到了帶有相應代碼的以下文件:
文件: week.h
class week
{
public:
week();
static const char * const days[];
};
檔案: week.cc(或week.cpp)
#include "week.h"
const char * const week::days[] = {"monday" , "tuesday", "etc..."};
week::week()
{
}
文件: main.cc(或main.cpp)
#include "week.h"
void main()
{
week w;
}
您需要在類函數之外聲明靜態數據成員。
例如:
class week
{
public:
week();
static const char * const days[];
};
char * week::days[] = {"monday" , "tuesday" "etc..."};
week::week()
{
}
如果將類定義拆分為頭文件(.h / .hpp),將會看到相同的問題。
作為一般准則,除非明確將它們指定為內聯函數,否則不要在頭文件中定義成員函數(這意味着從編譯器的角度來看,它們也應是內聯函數的良好候選者。)
當使函數內聯時,出於某些優化原因,是否選擇編譯器內聯取決於編譯器。 內聯聲明函數有兩種方法。
1) Implicit:-
Class Data
{
public:
void send()
{
}
};
2) Explicit:-
class Data
{
void send();
};
inline void Data::send()
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.