C로 C++ 흉내내는 중에 질문입니다.

cococo의 이미지

현재, C++ 로 만들 게 좋을 듯 한 프로그램을 C로 짜고 있습니다. -_-;
(담당자의 요구가, "난 C++을 모르니 C로 짜던가, C++을 가르쳐 주던가" 라고 하는군요.)
그래서 C로 C++을 흉내내 보려고 합니다.
대충 될 것 같아서 해보니...

일단 매크로를 이용해서 생성자(?) 랑 파괴자(?) 를 만드는 것까지는 했습니다. 또...this랑... 멤버 함수 비슷하게 등록하는 거하구요.
그런데, public, private같은 개념을 어떻게 넣어야 할 지 모르겠네요.
혹시 비슷한 작업을 해 보신 분 계시면, 답글 부탁드립니다.
아니면 , 좋은 아이디어라도... -_-;;

그럼, 좋은 주말 보내시기 바랍니다. ^^

IDNed의 이미지

C 자체에서는 그런 게 안되죠...
caller가 누군지 아는 방법이 있어야 할듯 하네요.
caller를 직접 구할 수도 없고(RET 확인;;; 플랫폼종속적으로 되잖아요;;;)
caller를 인자로 보내는 방법은 어떨까요?

아니면 아예 인터페이스부와 구현부를 완벽히 분리시킨 후
private될 함수들의 선언을 구현부에"만" 집어넣으시면...

winner의 이미지

이 function 들만을 이용해서 정의된 구조체를 사용할 것!!!
라는 주석을 통해서든 따로 문서를 작성하든 하는 것이...

private 과 public 이라는 것이 그냥 compiler 에 의해 자동으로 검출하기 위한 방식이라고 생각하면 굳이 꼭 있어야 하냐는 생각이 듭니다.

그런데 저도 C 로 C++ 와 같은 개념을 효과적으로 표현할 수 있냐는 고민을 좀 해봤었는데 public 상속을 어떻게 해야 할 지 모르겠더군요.

라고 생각했는데...

Search 해보십시요.
아주 많은 글이 나올 겁니다.

cinsk의 이미지

일단 상속의 기본은 parent의 data를 그대로 가져오는 것입니다. 따라서 다음과 같은 식으로 설계할 수 있습니다.

struct base {
  int data;
  /* ... */
};
 
struct derived {
  struct base parent;
  int data;
};
 
struct derived *p;
p = malloc(sizeof(derived));
((struct base *)p)->data = 3;
p->data = 4;

virtual function의 경우, 해당 struct마다 vtable (함수 포인터 배열)을 만들면 됩니다.

private/public의 경우, 현실적으로 방법이 없습니다. 물론 구조체의 정의를 숨긴 다음, access function만 써서 접근한다던지 하는 방법이 있겠지만, 완벽하지는 않습니다.

꽤 복잡한 코드지만, glib에 포함된 gobject에 대해서 분석해보시면 원하는 답을 얻을 수 있을 겁니다.

GObject Reference Manual
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

cococo의 이미지

감사합니다.
생각못한 방법들이 많이 있네요.
사실은 가장 원했던 것은 public이나 private를 위반했을 때
어떠한 형식으로든 에러가 표시되어, 최악의 경우 제 다음 개발자가 문서를 안 읽었다고 하더라도(이런 경우 꽤 있지 않나요? ^^) 그부분이 틀렸다는 것은 알려줄 수 있도록 하려 했던 건데요.
C에선 접근 권한 설정이 불가능하다는 것을 알았다는 것만으로도 큰 도움이 되었습니다. 더 삽질할 필요는 없다는 걸 알게 되었으니까요. 정말 감사드립니다.

말씀해 주신 대로, 문서화로 접근하는 게 시간당 효율이 가장 좋을 것 같습니다. 적당히 함수 이름 짓고, 모든 함수에 접근/변경 함수( Get/Set 계열) 를 만들어 놓으면, 바보가 아닌 이상에야 생각하고 쓰겠죠.
뭐... 문서도 안 읽고 함수 이름을 보고도 감 못 잡는다면... 그땐 그때 다시 생각해 보죠. ㅎㅎㅎ

답변 주신 cinsk, winner, IDNed 님께 감사드립니다.
모두들 좋은 하루 되세요. ㅎㅎㅎ

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

댓글 달기

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