1

我正在编写一个游戏,其中每个数据对象都由 ControlView 显示。当 ControlView 设置为显示数据对象时,不应更改它。我想使用 const 来执行这个约定。但是,为了响应用户稍后与 ControlView 的交互,可能会修改数据。所以需要存储一个非常量指针。我想知道这是否被接受并正确使用 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);
        }
};
4

3 回答 3

2

如果你想修改对象,不要做它const。修改const对象,例如通过const_cast,是未定义的行为。

所以不要使用constfor m_data,但是const您可以在代码中使用其他几个 s :

  • 您可以使用 保护函数参数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 或非常量。

最后提示:从右到左阅读声明:

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
于 2012-12-02T05:09:09.667 回答
2

在这种情况下,不,不要使用const. 如果你这样做了,你会让任何人将 aconst作为参数传递,并且之后可能会遇到未定义的行为:

 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
于 2012-12-02T05:13:32.883 回答
0

你需要明白什么const data *d意思。这意味着指针d可以更改,但指针d指向的对象类型Dataconst不可变的。

你应该拥有的是

void set_data(Data * const d)  //this call should not change d 
{ 
    m_data=d;
};

这段代码Data * const d意味着指针 d 不能被方法更改,但 d 指向可以更改的对象。

我的理念是,当你使用演员表时,你可能做错了什么。尽量避免它们。

于 2012-12-02T05:09:16.507 回答