【问题标题】:how to declare a const pointer that can be used as "this"如何声明一个可以用作“this”的常量指针
【发布时间】:2014-08-10 20:35:08
【问题描述】:

我有一个父 XWin 类来封装程序的“X 调用”。一次 我打开了显示器。我将指针传递给包含所有内容的 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++,“没关系,被调用的函数没有修改“this”?

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

这可能吗?

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

注意——我在这里发布之前尝试的第一件事是将 const 放在函数名称之后和参数列表之前,因为一个答案似乎暗示了这一点。不幸的是,这似乎将 object 声明为 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 的对象的指针,而不是对象。

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    C++ 常见问题解答在这里http://www.parashift.com/c++-faq/const-ptr-vs-ptr-const.html 有答案。

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

    XWin * const parent;
    

    有一个指向常量的指针有很多有用的原因。拥有一个常量指针的理由并不多。

    想一想你希望通过拥有一个常量指针来实现什么。有人会关心吗?编译器可以进行优化吗?通常不会。

    【讨论】:

    • 这是 1) 理智点,2) 我希望在第一个对象的析构函数中填充该指针以在对象销毁时“释放”它——无论如何我都可以这样做,但这是一个问题,也许是不合理的偏执狂?
    【解决方案2】:

    在这里,您声明了指向 const XWin 对象的指针。这意味着您不能修改对象。

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

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

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

    IMO,如果您将 const 放在右侧而不是左侧,则将其放在右侧会更简单,并且不会将常量指针与常量对象混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多