我正在编写一个游戏,其中每个数据对象都由ControlView显示。当ControlView设置为显示数据对象时,它不应更改它。我想使用const来强制执行此约定。但是,为了响应用户之后与ControlView的交互,可以修改数据。因此需要存储非const指针。我想知道这是否被接受并正确使用const_cast?。下面的骨架代码
class Data
{
int m_int;
public:
void add(int i) { m_int += i ; };
};
class ControlView
{
Data* m_data;
public:
void set_data(const Data* d) //this call should not change d
{
m_data=const_cast<Data*>(d); //cast needed to compile
};
void manipulate_data(int x)
{
m_data->add(x);
}
};
答案 0 :(得分:2)
如果您想修改对象,请不要将其设为const
。修改const
对象,例如通过const_cast
,是未定义的行为。
所以不要将const
用于m_data
,但是您可以在代码中使用其他几个const
:
const
保护函数参数。这通常不是很有意义,因为您通常不关心指针,而是它指向的对象。但它可以帮助您避免在代码中意外重新记录d
等错误:void set_data(Data * const d); // const pointer to (non-const) Data
// this means the function can not change d (the pointer), but it can
// change the object that d points to.
const
。这声明该函数不会以任何方式更改对象(除非有mutable
个成员)。如果您尝试修改此类函数中的任何成员,编译器将会出错。这些函数也是您可以在const
对象上调用的唯一函数。Data * get_data() const; // this function doesn't change anything
请注意,如果您有mutable
个成员,则可以从const函数更改,但这不应该被滥用。这适用于内部事物,如互斥或缓存。
另请注意,引用始终为const
- 无法将它们重新分配以指向另一个对象。它们引用的对象可以是const或非const。
最后提示:从右到左阅读声明:
Data * d; // pointer to Data (both can be changed)
Data * const d; // const pointer to Data (data can be changed)
Data const * d; // pointer to const Data (pointer can be changed)
Data const * const d; // const pointer to const Data (neither can be changed)
Data & d; // reference to non-const Data
//Data & const d; // invalid - all references are const
Data const & d; // reference to const Data
//Data const & const d; // invalid - all references are const
答案 1 :(得分:2)
在这种情况下,不,请勿使用const
。如果你这样做,你就让任何人传递一个const
作为参数,之后最终可能会遇到未定义的行为:
const Data d;
ControlView c;
c.setData(&d); //legal, because setData takes a const as parameter
c.manipulateData(0); //undefined behavior, modifying an originally const object
答案 2 :(得分:0)
您需要了解const data *d
的含义。这意味着可以更改指针d
,但指针d
指向Data
类型为const
的对象,即不可变。
你应该拥有的是
void set_data(Data * const d) //this call should not change d
{
m_data=d;
};
代码Data * const d
表示方法不能改变指针d,但d指向可以改变的对象。
我的理念是,当你使用演员阵容时,你可能会做错事。尽量避免它们。