C++ 에서 friend 선언의 모순??

login321의 이미지

.
.
.

class My;
 
class Your {
public:
    void getMoney(My::Won_TYPE amount, My& my);   // error : My::Won_TYPE ???
};
 
class My {
public:
    friend void Your::getMoney(My::Won_TYPE amount, My& my);
    typedef int Won_TYPE;
private:
    Won_TYPE m_money;
};
 
void Your::getMoney(My::Won_TYPE amount, My& my) {
    my.m_money -= amount;
}

class My 는 class Your을 friend로 선언합니다.

나의 private member인 m_money을 마음껏 getMoney할수 있게요.

friend를 선언할때는 클래스의 선언 및 정의의 순서를 잘 배치해야한다고 배웠는데

문제는 money의 타입을 typedef를 써서 Won_TYPE으로 하면

클래스 선언 및 클래스 정의의 배치 순서를 정하는데 모순이 생기는거 같습니다.

1. class My가 friend를 선언하려면 class Your가 정의되어있어야한다.

2. class Your가 정의되려면 class My가 선언되어야하며(Your의 정의에서 MY&를 사용함)

그뿐만 아니라 Won_TYPE을 알기위해서는 class My가 정의되어야한다.

3. class Your보다 class My가 먼저 정의되려면 friend선언이 불가능하다.

이런 모순이 실재 존재하는건지 아님 제가 어디서 잘못 생각하는건지 지적 좀 부탁드립니다.

(클래스 전체를 friend로 하면 안되고 함수만 friend로 선언하려고합니다. 좋은 설계법은 아닌거 같지만 c++를 이제막 입문하는 입장이라 문법적으로 가능한 방법이 있는건지 궁금합니다.)

obbaya의 이미지

모순이 있는 코드인지, 단순한 문법 문제인지 헷갈리네요 :)

에러는 Won_TYPE의 선언위치때문인데 Won_TYPE을 My 안에서 꼭! 가지고 있어야만 하고

코드 순서를 꼭! 위와 같이 해야만 한다면,

Won_TYPE부분을 들어내서 traits로 상속받아 사용하는건 어떨까 싶네요

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.