我想有一个类,它有一个方法指针,指向同一个类的两个可能方法之一。我使用Embarcadero XE2 bcc32。
当我尝试以下操作时,收到错误E2451 Undefined symbol findPosition
:
class A{
public:
double (A::*findPosition)(std::vector<int> arr, int tresh); //method pointer
double mean(std::vector<int> arr, int tresh){return 0;}; //case 1
double median(std::vector<int> arr, int tresh){return 0;}; //case 2
A(){findPosition=&(A::mean);} //constructor set pointer to case 1
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vals(5,1); // 1 1 1 1 1, example input
A obj;
obj.findPosition=&(A::median); //set method pointer to case 2
(obj.*findPosition)(vals,0); //ERROR: E2451 Undefined symbol 'findPosition'
system("pause");
}
(obj.*findPosition)(vals,0)
不是方法指针调用的正确版本吗?我应该使用boost:bind
吗?或者这通常是一个坏主意,我应该坚持像
class A{
public:
int flag;
double findPosition(std::vector<int> arr, int tresh){
if(flag==0)return mean(arr,tresh);
else if(flag==1)return median(arr,tresh);
};
double mean(std::vector<int> arr, int tresh){return 0;}; //case 1
double median(std::vector<int> arr, int tresh){return 0;}; //case 2
A(){flag=0;} //constructor set use to case 1
};
答案 0 :(得分:1)
.*
和->*
运算符的定义如下:
expression .* expression
expression ->* expression
右手表达式必须求值为指向左手表达式指定的对象内成员的指针。
代码无法编译,因为您尝试为右侧表达式传入一个不存在的局部变量。那个缺失的变量就是编译器所抱怨的。
你需要更像这样的东西:
(obj.*obj.findPosition)(vals,0);
或者,更清楚:
(obj.*(obj.findPosition))(vals,0);
或者,更详细:
double (A::*fp)(std::vector<int>, int) = obj.findPosition;
(obj.*fp)(vals,0);
话虽如此,如果您不担心其他编译器的可移植性,您可以改为使用BCC的__closure
扩展名:
class A{
public:
double (__closure *findPosition)(std::vector<int> arr, int tresh); //method pointer
double mean(std::vector<int> arr, int tresh){return 0;}; //case 1
double median(std::vector<int> arr, int tresh){return 0;}; //case 2
A(){findPosition=&mean;} //constructor set pointer to case 1
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vals(5,1); // 1 1 1 1 1, example input
A obj;
obj.findPosition=&(obj.median); //set method pointer to case 2
obj.findPosition(vals,0);
system("pause");
}