LINUX.ORG.RU

C++ For Real Programmers.


0

0

Перечитываю Джэфф Элджер "C++" (Jeff Alger C++ for real programmers). ISBN 5-8046-0045-1
Нашел песдатую штуку "Указатель на переменную класса" (стр 267). Следующий пример:

class Foo{
private:
        int x;
public:
        static int & Foo::*X() { return &Foo::x; }
};

Foo f = new Foo; // тут видать у него опечатка
int& Foo::*pm = Foo::X(); // вся магия нах. вычисляет смещение для int
int& i = f->*pm; // применяет смещение к экземпляру 

полная магия нах. хочу такое сделать, но компиляторы вопят:
cannot declare pointer to 'int&'

ладно. читаю у него дальше: "Все эти int& можно заменить на int*" -
меняю - получаю:

test.cpp: In static member function 'static int* Test::* Test::X()':
test.cpp:5: error: cannot convert 'int Test::*' to 'int* Test::*' in
return
test.cpp: In function 'int main(int, char**)':
test.cpp:10: error: cannot declare pointer to 'int&' 
                        ** в общем хер с ним 5-ой строки уже хватает **
test.cpp:10: error: cannot convert 'int* Test::*' to 'int Test::*' in
initializa
tion
test.cpp:11: error: invalid conversion from 'int' to 'int*'
make: *** [all] Ошибка 1


------------------
мой пример в аттачменте, вообще у меня волосы дыбом лезут во первых
использовать Foo:: внутри class Foo:: - имхо это ж вообще лажа. Во
вторых интересно такое вообще можно сделать? ты сталкивался с такой
фиговиной?

пробовал несколько разных g++


Что это фантазии затуманеного чем-то мозга Джеффа? Опечатка или я туплю? Кто-нибудь сталкивался с таким? И что это за дикий синтаксис. (MSVC ругается после замены int& на int*:

test.cpp(5) : error C2440: 'return' : cannot convert from 'int Test::*' to 'int *Test::* '
       Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
test.cpp(10) : error C2636: '<Unknown>' : pointer to reference member is illegal
★★★★★

Не знаю, что хотел автор, но вот так правильно:

class Foo{
private:
        int x;
public:
        static int Foo::*X() { return &Foo::x; }
};

main()
{
        Foo *f = new Foo;
        int Foo::*pm = Foo::X();
        int& i = f->*pm;
}

sergej ★★★★★
()
Ответ на: комментарий от sergej

Точно :). Спасибо. Похоже 5 опечаток на 12 строк кода :).

eXOR ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.