C++ 如何声明可以用作“的常量指针”;这";

C++ 如何声明可以用作“的常量指针”;这";,c++,constants,C++,Constants,我有一个父XWin类来封装程序的“X调用”。一旦 我已经打开了显示器。我将一个指针传递给包含所有 与X相关的指针(资源、显示等)和所有X调用都被执行 通过该类的指针 我有单独的对象,它们被传递给XWin类句柄,所以 他们可以通过包装器类进行图形调用 我试图将指针声明为“const” 当我使用“parent\ux”调用父类时,我遇到了问题。。。例如: parent_->setForeground(color); (g++)编译器告诉我 meter.h: In member function

我有一个父XWin类来封装程序的“X调用”。一旦 我已经打开了显示器。我将一个指针传递给包含所有 与X相关的指针(资源、显示等)和所有X调用都被执行 通过该类的指针

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

我试图将指针声明为“const”

当我使用“parent\ux”调用父类时,我遇到了问题。。。例如:

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“

我想使用“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 object”)“?是指向对象的指针,我要声明const,而不是对象。< /p> < p>这里有C++ FAQ。< /P> 您需要的是一个常量指针,而不是指向常量的指针

XWin * const parent;
拥有指向常量的指针有很多有用的理由,但拥有常量指针的理由并不多


通过一个常数指针来思考你希望达到的目标。有人会关心吗?编译器有哪些优化?通常不是。

< P>这里有C++ FAQ。

您需要的是一个常量指针,而不是指向常量的指针

XWin * const parent;
拥有指向常量的指针有很多有用的理由,但拥有常量指针的理由并不多


考虑一下使用常量指针希望实现的目标。有人会在意吗?编译器是否可以进行优化?通常不会。

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

Meter::Meter(const XWin * parent,...): parent_(parent) {}
class Meter {...
    const XWin * parent_;...}
实际上,您需要的是指向(非常量)
XWin
对象的常量指针

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

依我看,如果你把常量放在右边,而不是左边,那么把它放在右边会更简单,而且不会把常量指针和常量对象弄乱。

这里你是在声明指向常量
XWin
对象的指针。这意味着你不能修改对象

Meter::Meter(const XWin * parent,...): parent_(parent) {}
class Meter {...
    const XWin * parent_;...}
实际上,您需要的是指向(非常量)
XWin
对象的常量指针

Meter::Meter(XWin * const parent,...): parent_(parent) {}
class Meter {...
    XWin * const parent_;...}
依我看,如果你把const放在右边,而不是左边,那么把它放在右边会更简单,而且不会把常量指针和常量对象弄乱。

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