我有一个结构:
struct s { UINT_PTR B_ID; }; s d; d.B_ID=0x1;
工作正常,但我希望d.B_ID保持不变。我尝试使用(const)但它没有用。所以在我把一个值放到d.B_ID之后,我想把它变成一个常数。
有什么想法吗?
<小时/> EDIT
好吧我不希望整个结构不变。
当我设置计时器并使用b.B_ID作为计时器的想法
在里面
开关(WPARAM)
{
case b.B_ID // error:B_ID必须是常量
....
打破;
}
所以这就是为什么我需要它成为一个常数
答案 0 :(得分:3)
变量修饰符在编译时针对每个变量进行修复。您可能需要解释您尝试做的事情的背景,但这可能适合您的需求吗?
struct s
{
int* const B_ID;
};
int main (void) {
int n = 5;
s d = {&n};
int* value = d.B_ID; // ok
// d.B_ID = &n; // error
return 0;
}
由于您使用的是C ++,我建议:
class s {
public:
int* const B_ID;
s (int* id) :
B_ID (id) {
}
};
void main (void) {
int n = 5;
s my_s_variable = s(&n);
int* value = my_s_variable.B_ID; // ok
//my_s_variable.B_ID = &n; // error
return 0;
}
Ramiz Toma
:我需要使用s.B_ID =
在C / C ++中,类型修饰符(如const)在运行时为给定类型声明,并且在运行时无法更改。这意味着如果变量声明为const
,则永远不会将其赋值给使用赋值运算符。它只会在构造时被赋值。
这不是问题,因为你可以通过适当的设计来解决这个问题。
如果你说你需要使用赋值,我认为这是因为你在知道变量的值之前创建了结构。如果是这种情况,那么您只需要在知道值之后移动struct声明。
例如
s d; //variable declaration
//calculate B_ID
//...
int* n = 5;
//...
d.B_ID = &n;
这不起作用,因为如果你想让b.D_ID为'un assignable',那么它总是如此。您需要以下列方式重构代码:
//calculate B_ID
//...
int* n = 5;
//...
s d (&n);
//good
答案 1 :(得分:3)
struct s
{
s() : B_ID(0){}
UINT_PTR const B_ID;
};
int main(){
s d;
d.B_ID=0x1; // error
}
编辑:对不起,这是C ++中更新的代码段
struct s
{
s(UINT_PTR const &val) : B_ID(val){}
UINT_PTR const B_ID;
};
int main(){
s d(1);
d.B_ID=0x1; // error
}
答案 2 :(得分:3)
在C ++语言中,必须使用积分常量表达式(ICE)构建case
标签。 ICE是编译器在错误消息中的术语“常量”下所暗示的内容。类的非静态成员不能在ICE中使用。你不可能按照字面意思去做你想做的事情。即不能在case
标签中使用结构成员。
在此上下文中忘记switch
/ case
。使用普通if
分支代替switch
语句。
答案 3 :(得分:1)
你做不到 - 即。不可能选择性地创建struct const的单个成员。一种选择是“满足”整个结构:
s d;
d.B_ID=0x1;
const s cs = s; // when using this B_ID won't be modifiable - but nor would any other members
或者你可以在施工中设置它:
struct s
{
s(UINT_PTR const p): B_ID(p) {}
UINT_PTR const B_ID;
};
s d(0xabcdef);
答案 4 :(得分:0)
另一种方式是吸气剂和一次性定位器
class s
{
private:
bool m_initialized;
UINT_PTR m_value;
public:
s() : m_initialized(false), m_value(NULL) {}
s(UINT_PTR value) : m_initialized(true), m_value(value) {}
//no need for copy / assignment operators - the default works
inline UINT_PTR GetValue() const { return m_value; } //getter
bool SetValue(UINT_PTR value) //works only one time
{
if (m_initialized)
{
m_value = value;
m_initialized=true;
return true;
}
else
{
return false;
}
}
inline bool IsInitialized() const { return m_initialized; }
};