阻止“const”成员在另一个别名下被编辑
Posted
技术标签:
【中文标题】阻止“const”成员在另一个别名下被编辑【英文标题】:stopping a `const` member from being edited under another alias 【发布时间】:2013-04-06 23:08:24 【问题描述】:我有一个带有const
抽象成员的类。由于它是抽象的,因此对象必须位于更高的范围内。但是,它可以在这个更高的范围内进行编辑。我制作了这个 MWE,并添加了 cmets 来解释我想要实现的目标(即我知道这并没有达到我想要的目标)。
除了注释掉它,可以做些什么来阻止用户编辑对象。最好是白痴证明方法(最好是编译错误)
#include <iostream>
class Foo
private:
const int * p_abstract_const;
//int my application this is a pointer to abstract object
public:
Foo(const int * p_new_concrete_const)
p_abstract_const = p_new_concrete_const;
void printX()
std::cout << *p_abstract_const << std::endl;
;
int main()
int concrete_nonconst = 666;
Foo foo(&concrete_nonconst); // I want this NOT to compile
//const int concrete_const(1);
//Foo foo(&concrete_const); // only this should compile
foo.printX();
concrete_nonconst=999; // so that this will NOT be possible
foo.printX();
【问题讨论】:
不要引用,复制。这样,调用代码将无法访问原始对象。 @MatsPetersson 如果成员是抽象的,我该怎么做? 抽象到底是什么意思?成员是原生类型(int)而不是类 你有int concrete_nonconst = 666;
,然后是concrete_nonconst=999; // so that this will NOT be possible
。您无法阻止这种情况,因为它违反了语言标准 - 可以修改非常量变量。你想达到什么目标,可能有更好的方法?
@FKaria 我认为这将声明一个指向非const
int 的const
指针。有人请支持这个概念
【参考方案1】:
您可以在不提供实现的情况下将非常量 int* 构造函数设为私有:
class Foo
private:
const int * p_abstract_const;
//int my application this is a pointer to abstract object
Foo(int * p_new_concrete_const);
public:
Foo(const int * p_new_concrete_const)
p_abstract_const = p_new_concrete_const;
void printX()
std::cout << *p_abstract_const << std::endl;
;
int main()
int concrete_nonconst = 666;
Foo foo(&concrete_nonconst); // This won't compile
const int concrete_const(1);
Foo foo(&concrete_const); // But this will
foo.printX();
concrete_nonconst=999; // so that this will NOT be possible
foo.printX();
【讨论】:
以上是关于阻止“const”成员在另一个别名下被编辑的主要内容,如果未能解决你的问题,请参考以下文章
由于远程服务未运行,如何中断在连接状态下被阻止的 WCF 代理