如何声明一个可以用作“this”的const指针

时间:2014-08-10 20:35:08

标签: c++ const

我有一个父XWin类来封装一个程序" X-calls"。一旦 我打开了显示屏。我将指针传递给包含所有内容的Xwin类 生成与X相关的指针(资源,显示等)和所有X调用 通过那个班级的指针。

我有单独的对象,将句柄传递给XWin类 他们可以通过包装类进行图形调用。

我试图将指针声明为" const"

Meter::Meter(const XWin * parent,...): parent_(parent) {}
class Meter {...
    Const XWin * parent_;...}

当我使用" parent _" ...来调用父类时,我遇到了问题,如下所示:

parent_->setForeground(color);

用(g ++)编译器告诉我

meter.h: In member function ‘void Meter::setForeground(uns)’:
meter.h:72:33: error: passing ‘const XWin’ as ‘this’ argument of \
‘void Xwin::setForeground(long unsigned int)’ discards qualifiers \
 [-fpermissive]
   { parent_->setForeground(color); }

我怎么能告诉g ++,#34;没关系,被叫函数不会修改"这个"?

我想使用' const'作为一个显而易见的声明,这传递指针并没有在任何地方改变。不确定放在哪里' const'指示指针未被更改(并且不适用于指针) 指出,因为可能会改变)。

这可能吗?

(我在尝试第一个答案后尝试添加的非工作示例:-()

注意 - 我在发布之前尝试的第一件事就是将const放在函数名之后和参数列表之前作为一个答案似乎建议。不幸的是,这似乎将对象声明为const以及,而不是指向对象的指针。我通过以下方式找到了这个:

xwin.h: In member function ‘void XWin::done(int) const’:
xwin.h:34:38: error: assignment of member ‘XWin::done_’ in \
read-only object 
   void done( int val ) const { done_ = val; } ;

这给了我一个提示,即该位置的const适用于该函数并且不一定适用于指针(即使它确实如此,我也不想声明对象不变 - 那个将"可疑"充其量,调用一个方法来设置一个" const对象"它是指向我想要声明const的对象的指针,而不是对象。

2 个答案:

答案 0 :(得分:2)

C ++常见问题解答的答案为http://www.parashift.com/c++-faq/const-ptr-vs-ptr-const.html

你要求的是一个常量指针,而不是指向常量的指针。

XWin * const parent;

指向常量的指针有很多有用的原因。拥有常量指针的原因并不是很多。

通过使用常量指针来考虑你希望实现的目标。有人会关心吗?编译器可以进行优化吗?通常不会。

答案 1 :(得分:2)

在这里,您要声明指向const XWin对象的指针。这意味着您无法修改对象。

Meter::Meter(const XWin * parent,...): parent_(parent) {}
class Meter {...
    const XWin * parent_;...}

你真正想要的是指向(非const)XWin对象的常量指针。

Meter::Meter(XWin * const parent,...): parent_(parent) {}
class Meter {...
    XWin * const parent_;...}

IMO,如果你把const放在右边而不是左边,那么把它做得更简单,而不是用常量对象混乱常量指针。

相关问题