не позволяя члену const редактироваться под другим псевдонимом

У меня есть класс с 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();

}

3

Решение

Вы можете сделать ваш неконстантный конструктор 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();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector