我在使用头文件时遇到了一些麻烦。 我想"刷新"一个.h文件,用于更新其中常量的所有值,这些值取决于外部变量(在主.cc文件中定义)。 这大概就是这样的情况:
头文件(header.h)
extern int extern_value;
const int one = value;
const int two = value * 2;
const int three = value * 3;
主程序
#include "header.h"
int extern_value;
int main(){
extern_value = 10;
// Here is where I would like to refresh the header file.
// Here is where I would like to have my dependant constants
// (one, two and three) being updated.
return 0;
}
请考虑这是问题的极端近似值。 你们对如何解决它有什么想法吗? 提前谢谢。
编辑:
这是我的实际问题: 我想有一个头文件,其中包含我的项目所需的所有图形常量。它们都取决于显示器的大小。主程序的第一件事就是获取有关显示尺寸的信息;那么,我希望该计划能够出口"这个信息在头文件中,因此它可以相对于显示器的大小计算所有图形常量。
答案 0 :(得分:2)
你不能这样做。出于各种原因,但并非最不重要的原因是因为您的变量是const
,并且不会连续重新评估用于计算要分配给它们的值的表达式。
您想要的是使用functions:
extern int extern_value;
int one() { return extern_value; }
int two() { return extern_value * 2; }
int three() { return extern_value * 3; }
其他说明:
您可能不应该有extern
变量。将value
传递给函数:
int one(const int value) { return value; }
int two(const int value) { return 2 * value; }
int three(const int value) { return 3 * value; }
int main() {
int value = 10;
std::cout << one(value) << " " << two(value) << "\n";
return 0;
}
您无法“刷新”头文件。文件的内容是您键入的内容,当您使用#include "my_header.h"
时,会将其包含在内(有效地粘贴到)源文件中。您可以更新与非const变量关联的值,但是如果要重复计算具有不同值的表达式,最好的方法是将该表达式转换为 function ,如上所示,并调用具有不同参数的功能。
inline
,否则如果使用相同的定义,可能会警告(或接收错误)多个定义多个源文件中的标题。要解决您的实际问题,如果您需要通过extern
变量公开信息,则需要将它们设为非const ,并拥有main()
功能初始化它们,或在静态初始化期间执行此操作。在执行此操作时需要注意许多问题,因此提供相应地计算几何的函数,并将这些计算基于一个或两个函数参数或少量extern
变量更为安全。静态初始化为安全的东西,然后在信息可用后进行适当的设置。通过搜索例如,可以获得更多细节。 静态初始化或外部变量。
在这种情况下,您可能希望考虑创建一个类来保存几何体并执行相关计算。可以将指向该类实例的指针创建为extern
变量,并在程序初始化时(即静态地)初始化。然后,您可以将派生的“常量”作为成员函数提供,这些函数根据少量封装值计算结果,必要时可以设置/更新这些值。如果你小心的话,你甚至可以使它们const
。
例如,请参阅下面的示例(live demo):
// ******** HEADER FILE ********
class Geometry {
public:
Geometry(const int rows, const int cols)
: rows_(rows), cols_(cols) {}
int rows() const { return rows_; }
int cols() const { return cols_; }
int pixels() const { return rows_ * cols_; }
// whatever other "constants" you need, defined as functions
// containing expressions based on rows_ and cols_.
private:
// Make copy constructor & assignment operator private to prevent copying
Geometry(const Geometry&);
Geometry& operator=(const Geometry&);
// The data from which everything else is calculated
const int rows_;
const int cols_;
};
extern const Geometry* the_geometry;
// ******** SOURCE FILE ********
#include <iostream>
int main() {
const int rows = 80; // or however you get the number of rows
const int columns = 25; // or however you get the number of columns
the_geometry = new Geometry(rows, columns);
std::cout << the_geometry->pixels() << "\n";
return 0;
}
const Geometry* the_geometry = nullptr;