У меня есть класс с const
абстрактный член. Поскольку он абстрактный, объект должен находиться в более широкой области видимости. Однако, это может быть отредактировано в этой более высокой области. Я сделал это MWE и добавил комментарии, объясняющие, чего я пытаюсь достичь (т.е. я знаю, что это НЕ достигает того, чего я хочу).
Помимо того, что он может прокомментировать, что можно сделать, чтобы пользователь не мог редактировать объект. Предпочтительно, метод доказательства идиота (оптимально, ошибка компиляции)
#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();
}
Вы можете сделать ваш неконстантный конструктор 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();
}
Других решений пока нет …