Obj*_*Cat 5 c++ const global-variables
我正在为我的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;
//....
}
Run Code Online (Sandbox Code Playgroud)
Plane.cpp
const int Plane::kPlaneCapacity = 25;
Run Code Online (Sandbox Code Playgroud)
另外,要注意不断理解你的理解.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;
};
Run Code Online (Sandbox Code Playgroud)
问题是,如何初始化这个.一种方法可能是创建一个config.cpp如下所示:
#include "footype.h"
#include "bartype.h"
const int FooType::fooOption = 42;
const float BarType::barOption = 7.4;
Run Code Online (Sandbox Code Playgroud)
因此,您隐藏了信息,并且您仍然可以在一个位置(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;
};
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
如果需要,您甚至可以将选项设置为非const(但我没有看到配置选项中可变的点).