6

Я скопировал эту программу из учебника практики C++. Что происходит за кулисами?Общие сведения о операторах с указателем и членом

Ожидаемый результат:

сумма = 30 сумма = 70

#include<iostream> 
using namespace std; 

class M 
{ 
    int x; 
    int y; 
public: 
    void set_xy(int a, int b) 
    { 
     x=a; 
     y=b; 
    } 
    friend int sum(M m); 
}; 

int sum (M m); 
//so far so good, problem begins from here. what's happening after here? 
{        
    int M ::*px = &M ::x; 
    int M ::*py = &M ::y; 
    M *pm =&m; 
    int s= m.*px+ pm->*py; 
    return s; 
} 

int main() 
{ 
    M n; 
    void (M :: *pf)(int, int) = &M ::set_xy; 
    (n.*pf)(10, 20); 
    cout <<"sum=" << sum(n) << endl; 

    M *op= &n; 
    (op-> *pf)(30,40); 
    cout << "sum=" << sum(n)<< endl; 

    cin.ignore(); 
    getchar(); 
    return 0; 
} 
+0

"-> *" - это один оператор, а не два.Поэтому они не могут быть разделены. Вы НЕ МОЖЕТЕ писать «-> *». – fefe

+0

эта проблема решается. может кто-нибудь объяснить, что он работает, пожалуйста? –

+0

Удаление тега «visual-studio», поскольку это не проблема, характерная для компилятора – iammilind

ответ

1

Проблема из-за дополнительные пробелы в op-> *pf:

(op->*pf)(30,40); // ok 

I думаю, @fefe, вероятно, сказала причина в комментарии. ->* - это единственный оператор, аналогичный .*. Итак, если эти 2 разделены, то это приведет к разному синтаксису, который дает ошибку компилятора.

+0

Я читал где-то, что C++ не беспокоит пробелы. давайте попробуем, если это сработает. –

+0

Да, это работает :) Теперь, что происходит. –

+3

@ jeet.mg: оператор '-> *'. Вы не можете помещать пробелы в любом месте (например, 'dele te' - это не то же самое, что' delete') – Mat

1

Взгляните на Pointer to class data. И для ошибки, -> * - оператор, вы не можете поместить между ними пробел.

+0

......................... круто :) –

1

iammilind ставка на ошибку; op-> *pf необходимо изменить так, чтобы у вас было ->* вместе как один оператор - pointer to member operator (не удалось найти лучшую ссылку). Пробел в op ->* pf совершенно применим.

То же самое для i++; ++ является единственным оператором и вызывает ошибку, если вы попробуете и имеете i+ +.

Теперь, что он делает. Примером является указатель на элемент. pf объявляется как функция-член class M, которая принимает два аргумента int с возвратным типом void. Он инициализируется, чтобы указать на функцию M::set_xy.

Внутри main:

  • n имеет тип M, поэтому для того, чтобы использовать pf позвонить set_xy из n вы бы использовать .* оператор: (n.*pf)(10, 20);. Это эквивалентно n.set_xy(10, 20);.

  • С op имеет тип M* (указатель на M объекта), вам нужно использовать оператор ->* и вызвать функцию, на которую указывает pf как: (op->*pf)(30, 40);, что эквивалентно op->set_xy(30, 40);

Внутри sum:

  • примеры просто указателей на член/переменные экземпляра, в отличие от functi членов дополнения. Это просто показывает, как вы добавляете вместе m.x и m.y, используя эти типы указателей.

 Смежные вопросы

  • Нет связанных вопросов^_^