这里相当新的程序员,并为愚蠢的问题提前道歉。
我在程序中有一个int
变量,用于确定我的某些结构中数组的长度。我曾经把它作为const int
放在我的标题中。现在,我想分叉我的程序,根据给定的参数给变量赋予不同的值,但在运行时分配后保持只读。
我必须做的一些想法。有没有首选方式?
const int *
并将其分配给我的主要功能中的const int
,但这看起来很笨拙。int
。答案 0 :(得分:9)
我使用函数静态变量和简单函数。观察:
int GetConstValue(int initialValue = 0)
{
static int theValue = initialValue;
return theValue;
}
由于这是一个函数级静态变量,因此只在第一次初始化时才初始化。因此,在第一次运行函数后,initialValue
参数无效。因此,您需要做的就是确保函数的第一次调用是初始化函数。
答案 1 :(得分:6)
C ++没有内置的解决方案,但如果你真的想确保你的int只被分配一次,你可以构建自己的特殊int类:
class MyConstInt
{
public:
MyConstInt(): assigned(false) {}
MyConstInt& operator=(int v)
{
assert(!assigned);
value = v;
assigned = true;
return *this;
}
operator int() const
{
assert(assigned);
return value;
}
private:
int value;
bool assigned;
};
MyConstInt mi;
// int i = mi; // assertion failure; mi has no value yet
mi = 42;
// mi = 43; // assertion failure; mi already has a value
int* array = new int[mi];
答案 2 :(得分:1)
什么时候才知道正确值?如果您从文件或其他内容中读取它,您可以说:
const int n = determine_correct_value();
答案 3 :(得分:0)
我很想说你想要的东西没有意义。常量是不改变其值的东西,而不是可能改变其值一次或两次的东西。如果你想要一个全局变量,只需使它成为非常数。
另一方面,如果你有范围常量值,你只需要同时声明和初始化它们,遵循一般的C ++指南,尽可能接近使用站点。例如,在以下本地范围内标记常量的使用:
for (auto it = v.begin(), end = v.end(); it != end; ++it)
{
const Foo & x = *it;
const std::size_t n = x.get_number_of_bars();
// use x and n ...
const bool res = gobble(x, zip(n));
if (res && shmargle(x)) { return 8; }
}
如果它们的值已经通过其他方式已知,编译器甚至可以选择不为变量生成任何特殊代码。