C++ 몇 일 전부터 배우는 초보인데요..

espoirgod의 이미지

C 언어랑은 한동안 친하게 지내서 좀 아는 사이구요ㅎ_ㅎ;
C++ 은 이제 막 꼬시는 중입니다.
얘가 잘 넘어올지~ㅋㄷㅋㄷ

같은 클래스로 정의된 인스턴스는 멤버 변수는 따로 갖지만
멤버 함수는 공유한다고 나와있어서 확인을 하기 위해서
코딩을 했습니다. 그런데, 함수 부분의 주소를 출력하는게
마음처럼 되지 않네요.

C 에서는 다음처럼 하면 되는데..

#include <stdio.h>

int main()
{
        int (*p)();

        p = main;
        printf("%u %u\n", *p, main);

        return 0;
}

C++ 에서 다음처럼 하면 에러가 나네요.

int main()
{
        test d, e;
        void (*dp)(), (*ep)();

        dp = d.testtest;
        ep = e.testtest;

        printf("%u - %u, %u - %u\n", d.testtest, *dp, e.testtest, *ep);

        return 0;
}

a.cpp: In function `int main()':
a.cpp:21: error: argument of type `void (test::)()' does not match `void (*)()'
a.cpp:22: error: argument of type `void (test::)()' does not match `void (*)()'
a.cpp:24: error: invalid use of member (did you forget the `&' ?)
a.cpp:24: error: invalid use of member (did you forget the `&' ?)

타입이 맞지 않는다는 얘기와 유효하지 않은 멤버를 사용했다고 나오는데..

어떻게 하면 제가 원하는 목적을 달성할 수 있을까요?

참고로 www.winapi.co.kr 의 3부 C++ 문법편을 보고있어요.

>>>>>>>>>>>추가질문<<<<<<<<<<<<<

C++ 의 manpage 는 없는건가요?
man cin 이라고 입력해도 아무것도 안나와서요;
만약 있다면 manpage 를 어디서 받아야하나요?

답변 부탁드립니다.

Kroisse의 이미지

으음... 함수 포인터 구문인가요?

dp = d.testtest;

여기에서 dp가 포인터고 d.testtest가 멤버 함수라면 둘의 타입이 안 맞아서 에러가 나는 듯 합니다만...
C++은 (C보다) 타입 캐스팅이 엄격합니다.

여담이지만, 굳이 저런 식으로 사용할 필요가 있을까요.
......C++ 소스 자체를 본 지가 오래 되어서 코드 전체가 이해가 안 되기도 하지만서도 말입니다. -_-;;;

익명 사용자의 이미지

//선언
void (test::*pMF)();
//대입
pMF = &test::testtest;
//호출
(d.*pMF)();
(e.*pMF)();

그리고 멤버함수의 메모리 주소에 관해서는 g++이 말하기를,
"ISO C++ forbids taking the address of a bound member function."이라네요.