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."이라네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.