C++에서 함수포인터 사용 자주하나요?

cyrius11의 이미지

고수님들께 질문 드려요.
C++에서 함수 포인터를 자주 사용하나요?
이론만 봤을 때는 이 함수 포인터라는 것을 언제 사용하는지 감이 잘 안오거든요.
혹시 유용하게 사용하는 경우를 아시면 알려주세요~~~

pok의 이미지

Effective C++에 strategy 패턴 대용으로 함수 포인터를 사용하는 방법이 나옵니다.
함수포인터 배열을 상태기계의 아이디를 배열의 인덱스로 하여 사용하기도 하구요.
디자인 패턴에서도 State패턴은 State가 많고 클래스가 작을 경우에는 State패턴을 쓰기에 적당하지 않다고 전하고 있고 그 대안으로 테이블을 이용한 방법을 제시하는데, 그 테이블을 함수포인터 배열로 구현이 가능하고요..

혹은 mem_func 등의 어댑터를 이용하여 함수자 대신으로 쓰기도 합니다.


poklog at http://poksion.cafe24.com/poklog/

seank76의 이미지

보통 event-subscribe 모델에서 어떤 event에 대한 콜백 함수로 함수 포인터를 많이 쓰죠.

물론 자바틱하게 abstract class/interface를 argument로 받아서 정해진 함수이름을 불러주는 방법도 있지만, 그냥 함수 포인터를 사용하는게 편리할때가 많아요. (C++에선 물론 함수 포인터 뿐만 아니라 Object 포인터도 받아야겠죠.)

예를 들어 여러개의 event handler가 한 클래스 안에 존재하는 경우,

자바의 경우엔

class MyEventHandler implements A_listener, B_listener, C_listener {
...
public void registerListeners() {
_handler.add_A_listener(this);
_handler.add_B_listener(this);
_handler.add_C_listener(this);
...
}
}

이렇게 가야 되는데 listener interface들이 정확하게 정의 되있야되니까 이게 영 불편하거든요. (뭐 익숙하신 분들도 많겠지만 제 개인적인 생각으론말이죠...)
또 만일 두개의 listener들이 같은 함수 이름을 부르게 되있으면 또 골치 아프죠.

C++ 의 경우엔

class MyEventHandler {
...
void registerListeners() {
_handler.add_A_listener(this, CALLBACK a_handler);
_handler.add_B_listener(this, CALLBACK b_handler);
_handler.add_C_listener(this, CALLBACK c_handler);
...
}
};

이런 식으로 가니까 좀더 유동성이 있죠.
어느 클래스나 함수 형식만 같다면 콜백으로 바로 add할수 있으니까요.

only2sea의 이미지

일단 C 보다는 좀 적게 사용해도 되는 것 같습니다.

C에서 virtual function 구현하려고 하면 함수 포인터를 써야 하는데, C++에서도 마찬가지로 구현되긴 하지만 프로그래머가 함수 포인터를 따로 관리해서 쓸 필요는 없죠.

그리고 함수객체를 이용하여 해결 가능한 부분도 있습니다.

그러나 간단하게 함수 포인터를 만들어 쓰는게 좋을 때가 많아요. STL에 넣어도 잘 동작하구요.

이제는 서명에 무엇을 써야하는지 생각해보자.

Scarecrow의 이미지

질문하신분이 초보입장이라고 가정하고 답글 적어 드리겠습니다.

처음 C/C++을 배우면서
"함수포인터라는 것도 있구나. 근데 대체 이건 어디 쓰는걸까?"
하는 의문이 들어서 질문을 하신거라면

C 표준함수중에 qsort()같은 함수를 한번 사용해 보세요.
인자로 함수포인터를 가집니다.
함수포인터가 왜 필요한지 기본적인 감은 올겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.