English 中文(简体)
为什么我能从最复杂的方法中召集一个非最接近的成员职能点?
原标题:Why can I call a non-const member function pointer from a const method?
  • 时间:2010-03-26 13:26:01
  •  标签:
  • c++

一位同事询问了这种守则中最初有模板的类似守则。

我删除了模板,但核心问题仍然是:为什么把科索沃汇编成册?

#include <iostream>

class X
{
public:
     void foo() { std::cout << "Here
"; }
};

typedef void (X::*XFUNC)() ;

class CX
{
public:
    explicit CX(X& t, XFUNC xF) : object(t), F(xF) {}      
    void execute() const { (object.*F)(); }
private:
    X& object;
    XFUNC F;
}; 

int main(int argc, char* argv[])
{   
    X x; 
    const CX cx(x,&X::foo);
    cx.execute();
    return 0;
}

鉴于CX是个目标,其成员职能execute<>em>,因此在CX中:可以选择ts点。

但是,我可以通过一个成员职能点来召集一个非成员的职能。

成员的职能点是否是世界上最自然的有文件记载的漏洞?

我们错过了什么问题(对其他人来说可能是显而易见的)?

最佳回答

在这方面,<条码>目标是指<条码>X>>>,而不是参照一个星座<条码>X>>。 <条码>const 限定词将适用于该成员(即参考,但参考编号为const),而不是参考物体。

1. 如果您改变本类定义,不使用提及:

// ...
private:
    X object;
// ...

你会发现错误。

问题回答

constness of execute() only impacts the this pointer of the category. 该代码的类型为ts a const T*,而不是仅限 T*。 这不是一个深层的趋同,它只是意味着成员本身不能改变,但任何他们所说的话或提及仍然可以改变。 您的<条码>目标成员已经不能改变,因为不能再提及任何其他内容。 同样,你没有 交换<>。 <代码>F member, only dereferencing it as a member function pointer. 因此,这是允许的,也是科索沃的。

您对CX星座的论述没有任何变化:这再次意味着不允许对准成员进行修改,但再次表明它们认为仍然可以做的事情。 你们仍然可以把成员的职能称作目标,因此不会改变。

说明:

class MyClass
{
public:
    /* ... */

    int* p;

    void f() const
    {
        // member p becomes: int* const p
        *p = 5;   // not changing p itself, only the thing it points to - allowed
        p = NULL; // changing content of p in const function - not allowed
    }
};

object of n }X并非一环。 它只是被一个最复杂的物体所指。 先验适用于次目标,而不是参考物体。

按照替代逻辑,<代码>const 这种方法无法修改任何thing。 这称为“纯功能”,这一概念在现行标准C++中并不存在。

http://code>foo。

由于object被宣布为X&,在固定的CX中,该编码实际上是。 X& const (与<代码>const X&不相同)允许你使用该编码的非最常用方法。

考虑这一问题的一个有益办法是: X物体根本不是CX的成员。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?