今天在寫C++程式的時候遇到了一個很奇怪的問題,完成沒有辦法解釋,也就是類的成員函式的指標無法在類外顯式呼叫。
有點繞口,代碼如下:
類的頭檔案 node.h
#include <stdio.h>
#include <iostream>
class node;
typedef double (node::*pf)(double x);
class node
{
public:
node();
~node();
double func1(double x);
pf p;
double fp(double x);
private:
};
類的源檔案 node.cpp
#include "node.h"
node::node()
{
p = &node::func1;
}
node::~node()
{
}
double node::func1(double x)
{
std::cout << "func1:" << x;
return 1;
}
double node::fp(double x)
{
return (this->*p)(x);
}
呼叫的主函式檔案 main.cpp
#include "node.h"
int main()
{
node A;
double x = 1.0;
A.p(x);//error1
A.*p(x);//error2
*(A.p)(x);//error3
A.fp(x);//correct;
return 1;
}
原因分析:
目前沒有找到原因。
定義了一個成員函式指標,指向類的成員函式,但是在類外部的普通函式中無法通過該指標呼叫類的成員函式,以上三種呼叫方式都是編譯未通過。
uj5u.com熱心網友回復:
成員函式會自動系結一個this指標引數,所以這樣定義函式指標是不對的。uj5u.com熱心網友回復:
(A.*(A.p))(x);//error2uj5u.com熱心網友回復:
指向類成員函式的指標其實相當于一個偏移量,也就是p是func相當于node類的偏移量所以不能直接用p(x) 方式呼叫,而要用A.*p(x)方式
但是由于p是node的一個成員,類非靜態成員必須結合類物件才能確定。
就好比 class A有個int 成員x ,你不能直接x=10;而要 A a1;a1.x=10;
同理你的 p也是node的一個成員要訪問它,需要A.p
所以呼叫如下
(A.*(A.p))(x) 方式呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9525.html
標籤:C++ 語言
上一篇:qt顯示問題。。。。
