阻止“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 代理

为啥套接字被阻止接收,而我睡在另一个线程上?

如何在另一个 NSView 下阻止 NSView 事件?

ruby 在Ruby on Rails中阻止别名

C++中explicit const mutablestatic关键字

如果已在另一个选项卡中打开,则阻止打开 html