阻止`const`成员在另一个别名下被编辑

时间:2013-04-14 22:09:46

标签: c++ const alias abstract member

我有一个带有const抽象成员的类。由于它是抽象的,因此对象必须位于更高的范围内。但是,它可以在更高的范围内进行编辑。我已经制作了这个MWE,并添加了解释我想要实现的内容的评论(.i.e。我知道这不能达到我想要的目的)。

除了评论它之外,还可以做些什么来阻止用户编辑对象。优选地,防止白痴的方法(最佳地,编译错误)

#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();

}

1 个答案:

答案 0 :(得分:0)

您可以在不提供实现的情况下将非const 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();
}