簡體   English   中英

在C ++中適當使用全局const變量?

[英]Appropriate use of global const variables in C++?

我正在為我的CS課程開發一個程序。 它模擬了送貨公司在機場的活動。

這是一個非常簡單的小程序,由一些頭文件和源文件以及一個編排模擬的main.cpp源文件組成。

存在某些給定的常數值,例如裝運到達的頻率,飛機的負載能力,工人處理某些物品所花費的時間等等(均為整數值)。 我需要在main.cpp中的幾個函數中訪問這些變量

將main()函數上面的這些聲明為const int是合理的,有效地使它們成為全局的,例如

const int kTotalTime = 2000;
const int kPlaneCapacity = 25;
int main(){//...program code}

我知道在大多數情況下都要避免使用全局變量,因為對它們的調用和/或修改位置沒有限制,這可能導致意外破壞程序的某些部分,這反過來可能很難調試,如以及為將來的代碼等引起兼容性問題。然而,由於這些是在整個程序中使用的原始數據類型的只讀值,因此它似乎是一種合理的解決方案。 此外,它向讀取代碼的任何人以及編譯器明確聲明了變量的用途。

問題:我的邏輯有缺陷嗎? 怎么會這樣? 全局變量(常量或非常量)何時合理使用? 如果這是一個糟糕的解決方案,那么您如何建議聲明這些常量只讀值?

非常感謝您的寶貴時間!

我認為最好將常量作為靜態放在類中。

我假設你有類Plane ,就這樣做:

Plane.h

class Plane{
   static const int kPlaneCapacity;
   //....
}

Plane.cpp

const int Plane::kPlaneCapacity = 25;

另外,要注意不斷理解你的理解。 Pi是一個常數。 10是常數。 我確實看到你如何認為飛機的容量是恆定的,但想一想:如果你的老師說你的下一個任務,你的飛機容量應該是30,而不是25。

關於你的程序的大小和目的(我從你的描述中理解)它可能無關緊要,但由於它具有教育背景,我建議“ 做正確 ”。

在這種情況下,我會選擇一個Config結構(或類,如果你想讓它更聰明,見下文),它帶有配置值並且可以在程序周圍拋出。 它的優點是,如果您必須從文件或命令行中獲取選項,則可以輕松更改它。

至於類與結構的東西(注意我在這里做出邏輯上的區分,而不是技術上的)。 您可以將所有值作為成員放在結構中並傳遞給它的const引用,或者使它成為一個完整的類,其中包含隱藏數據來源(及其生成方式)的訪問器。 編程始終是決策,這是您的決定。 如果您認為將來必須允許更多的配置(如上所述),您可能想要進行類抽象。

另一種選擇是將數據分散到您的程序中,這實際上比聽起來要聰明得多。 如果每個類只知道它的配置選項(並隱藏它們),你實際上可以使用你正在使用的OOP語言。 例:

// footype.h
class FooType {
  private:
    static const int fooOption;
};
// bartype.h
class BarType {
  private:
    static const float barOption;
};

問題是,如何初始化這個。 一種方法是創建一個如下所示的config.cpp

#include "footype.h"
#include "bartype.h"

const int FooType::fooOption = 42;
const float BarType::barOption = 7.4;

所以你有信息隱藏,你仍然在一個地方( config.cpp )一起擁有所有的配置選項。

編輯:

如果您有許多(多個)不同模塊所需的配置選項,您可以進行一些復雜化(使用間接),如下所示:

// footype.h
class FooType {
  private:
    static const int& fooOption;
    static const bool& dumpLevel;
};
// bartype.h
class BarType {
  private:
    static const float& barOption;
    static const bool& dumpLevel;
};

config.cpp:

#include "footype.h"
#include "bartype.h"

static const int opt_foo = 42;
static const float opt_bar = 7.4;
static const bool opt_dumpLevel = false;

const int& FooType::fooOption = opt_foo;
const bool& FooType::dumpLevel = opt_dumpLevel;
const float& BarType::barOption = opt_bar;
const bool& BarType::dumpLevel = opt_dumpLevel;

如果需要,您甚至可以將選項設置為非const(但我沒有看到配置選項中可變的點)。

全局變量(常量或非常量)何時合理使用?

如果您的程序是多線程程序,那么您應該認真考慮使用全局變量,因為它們需要適當的同步以避免競爭條件 通常,正確的同步不是一項非常簡單的任務,需要一些嚴肅的不受歡迎和思考。

這是一篇好文章的摘錄:

非本地化 - 當各個元素的范圍有限時,源代碼最容易理解。 全局變量可以由程序的任何部分讀取或修改,使得難以記住或推理每種可能的用途。 無訪問控制或約束檢查 - 程序的任何部分都可以獲取或設置全局變量,並且可以輕松地刪除或忘記有關其使用的任何規則。

隱式耦合 - 具有許多全局變量的程序通常在這些變量之間存在緊密耦合,以及變量和函數之間的耦合。 將耦合項目分組為有凝聚力的單元通常會帶來更好的計划。

內存分配問題 - 某些環境具有內存分配方案,使得全局變量分配變得棘手。 在“構造函數”具有除分配之外的副作用的語言中尤其如此(因為,在這種情況下,您可以表示兩個全局變量彼此相互依賴的不安全情況)。 此外,當動態鏈接模塊時,可能不清楚不同的庫是否有自己的全局變量實例或者是否共享全局變量。

測試和限制 - 使用全局變量的源更難以測試,因為在運行之間無法輕易建立“干凈”的環境。 更一般地,利用未明確提供給該源的任何類型的全局服務的源很難以相同的原因進行測試。

鑒於以上所有,只要您了解陷阱並了解使用全局變量的方式確實可以使您的程序與這些陷阱絕緣,那么您可以繼續使用全局變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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