Вызов указателя метода C ++ дает неопределенную ошибку символа?

Я хотел бы иметь класс, который имеет указатель на метод, который указывает на один из двух возможных методов того же класса. Я использую 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

Решение

.* а также ->* операторы определяются следующим образом:

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");
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector