簡體   English   中英

我可以在同一個.CPP文件中聲明和定義靜態類變量嗎?

[英]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;
}

更新:

看看我糾正的一些錯誤:

  1. 添加了; 在課程結束時
  2. 將靜態變量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM