cpp에서 동일한 클래스간에는 private부분도 직접 참조 가능한가

philossh의 이미지

아래처럼 동일한 클래스간에는 private로 선언되었더라도 직접 엑세스가 가능한지??

class A
{
    private:
        int data;
        ...
    public:
        ...
        void func(A& a);
};

void A::func(A& a)
{
    a.data = data;
}

void main()
{
    A a, b;
    a.func(b);
    ..
}

VC .NET에서는 되는 듯 한데..
이런식으로 원래 가능한건 가요??
저는 a.set(data); 이런식인 줄 알았는데..

대충 공부한게 탈인건지.. :cry:

mr.lee의 이미지

음..

자기 집안에 있는 컴퓨터를 본인이나 친구도 사용하지 못하면 아무도 쓸 수 있는 사람이 없겠지요?

philossh의 이미지

어린이라는 클래스와 어른이라는 클래스가 있을경우..
어린이 클래스와 어른클래스가 각각 일기장이라는 자기만 쓰는것이 있습니다.

어린이 A, B 어른 C라는 인스턴스가 있을경우..
A가 C를 두들겨 패도.. 서로의 일기장은 비밀이 유지되지만..
(A.func(어른& C) 일경우 A는 C의 일기장을 쓸수 없음..)
A가 B를 두들겨 팬경우.. A가 B의 일기장에 낙서를 할 수 있음..
(A.func(어린이& B) 일경우 A는 B의 일기장을 쓸수 있음..)

저의 질문은 이런거였는데.. :oops:

To be or not to be.
That is the question.

doldori의 이미지

어린이들끼리는 굳이 두들겨패지 않아도 서로의 일기장을 보고 쓸 수 있습니다.

* 혹시 뭐 스트레스 받으시는 일이라도...? :shock:

philossh의 이미지

doldori wrote:
어린이들끼리는 굳이 두들겨패지 않아도 서로의 일기장을 보고 쓸 수 있습니다.

* 혹시 뭐 스트레스 받으시는 일이라도...? :shock:


흠..
어린이 클래스와 어른클래스를 바꾸도록 하겠습니다.. :roll:

스트레스라... 옆구리가 너무 시려요~ :cry:

To be or not to be.
That is the question.

익명 사용자의 이미지

a.data = data;

이 문장에서 data 항은 접근 가능할 것 같은데,

a.data 항은 이용할 수 없을 것 같군요.

doldori의 이미지

Anonymous wrote:
a.data = data;

이 문장에서 data 항은 접근 가능할 것 같은데,

a.data 항은 이용할 수 없을 것 같군요.


비유로 돌려서 말을 한 것이 화근이군요.
이 문장은 적법합니다. A 클래스의 모든 개체는 A 클래스의 모든 멤버에
접근 가능합니다. this->data건 a.data건 상관없이요.
익명 사용자의 이미지

그런데 잘 컴파일 되네요.

익명 사용자의 이미지

class 남자
{
private:
	int 여자친구;

public:
	void func(남자& 누구);
};

void 남자::func(남자& 누구)
{
	누구.여자친구 = 여자친구;
}

int main()
{
	남자 남자1, 남자2;
	남자1.func(남자2);

	return 0;
}

-_-;;;;

lifthrasiir의 이미지

philossh wrote:
아래처럼 동일한 클래스간에는 private로 선언되었더라도 직접 엑세스가 가능한지??
class A
{
    private:
        int data;
        ...
    public:
        ...
        void func(A& a);
};

void A::func(A& a)
{
    a.data = data;
}

void main()
{
    A a, b;
    a.func(b);
    ..
}

VC .NET에서는 되는 듯 한데..
이런식으로 원래 가능한건 가요??
저는 a.set(data); 이런식인 줄 알았는데..

대충 공부한게 탈인건지.. :cry:

* 제가 실수 혹은 무지로 잘못 쓴 부분들이 워낙 많군요; 아이고 죄송합니다. 아랫 분들의 글들을 참조하시길 바랍니다. (쪽팔려서 내용은 슥 -_-)

- 토끼군

익명 사용자의 이미지

tokigun wrote:
philossh wrote:
아래처럼 동일한 클래스간에는 private로 선언되었더라도 직접 엑세스가 가능한지??
class A
{
    private:
        int data;
        ...
    public:
        ...
        void func(A& a);
};

void A::func(A& a)
{
    a.data = data;
}

void main()
{
    A a, b;
    a.func(b);
    ..
}

VC .NET에서는 되는 듯 한데..
이런식으로 원래 가능한건 가요??
저는 a.set(data); 이런식인 줄 알았는데..

대충 공부한게 탈인건지.. :cry:

a.data는 사용 불가능입니다. 한 클래스 A에서 private로 선언된 변수나 메소드 등등등등은 그 클래스 안의 함수에서 자기 자신을 참조할 때만 사용할 수 있고 (즉 data는 자기 자신을 가리키죠) 같은 클래스의 인스턴스라도 다른 인스턴스거나 심지어 한 번 돌아서-_- a.func(a) 같이 자기 자신을 넘겨 받았을 경우에는, func 입장에서 data는 자기 자신의 변수라는 걸 보장할 수 있지만 a.data는 다른 인스턴스의 변수이기 때문에 (a가 자기 자신이라는 보장이 없지요) 사용할 수 없습니다. 보통 이런 경우에 data를 외부에서 읽을 수 있다면 inline function으로 getData 같은 메소드를 만들어서 쓰는 것이 보통입니다.

물론 직접 접근하는 게 아예 안 되는 건 아니고 func를 friend로 선언하면 가능하긴 합니다. 자세한 건 직접 찾아 보시길 바랍니다.

- 토끼군


잘못 알고 계시네요.
C++에서는 (java도 마찬가지일듯) 접근제한(private과 같은)이 object단위가 아니라 class단위입니다.
따라서 같은 class에 속하는 객체(instance)라면 서로 다른 객체의 멤버변수를 참조/수정할 수 있습니다.
소리의 이미지

Quote:
ISO/IEC 14882:1998
11 - Member access control [class.access]

-1- A member of a class can be
* private; that is, its name can be used only by members and friends of the class in which it is declared.


표준 문서에서 객체를 class로 표현했을 땐 instance와 확실히 구분됩니다. 즉 같은 class의 private 변수라면, 그것이 다른 instance의 변수라고 해도 접근할 수 있는 것입니다.

tokigun wrote:
물론 직접 접근하는 게 아예 안 되는 건 아니고 func를 friend로 선언하면 가능하긴 합니다. 자세한 건 직접 찾아 보시길 바랍니다.

착오를 하신 모양이네요. friend 선언은 instance 단위가 아닌 class 단위로 이루어지는데 그걸로 어떻게 접근을 허락해야하는지 불허해야하는지 구분하겠어요. ;)
lifthrasiir의 이미지

헉. friend 얘기를 저기서 왜 했지.... -_-;;; 제 실수입니다. 그나저나 private/protected가 인스턴스 단위가 아니라 클래스 단위인 건 제가 미처 몰랐군요. 제 불찰입니다. orz

- 토끼군

htna의 이미지

class CBase {
};
class CPrivate : public CBase {
private:
    int _int;
};
class CDerived : public CPrivate {
};
class CHacked : public CBase {
public:
    int _hacked_int;
};

void main()
{
    CDerived value;
    CHacked* hacked_value = (CHacked*)((void*)((CPrivate*)&value));
    hacked_value->_hacked_int = 10;
}

음..
될것 같군요...
private 함수도 참조하는 방법이 있을것 같은데...

WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra

pcpenpal의 이미지

tokigun wrote:
헉. friend 얘기를 저기서 왜 했지.... -_-;;; 제 실수입니다. 그나저나 private/protected가 인스턴스 단위가 아니라 클래스 단위인 건 제가 미처 몰랐군요. 제 불찰입니다. orz

- 토끼군


사실 모르기가 쉬운 것 같아요. 그리고 상식적... 이라기 보다는 어떤 단어가 좋을지는 모르겠지만 아무튼 그렇게 생각해 볼 때 object 단위로 생각하는 것이 자연스러워서...

아는 바로는, Java도 class 단위입니다~

@ 토끼군, 잘 지내는감? 궁금하구나!

익명 사용자의 이미지

java 는 클래스 단위 가시성이 아닙니다..

그것이 자바와 C++ 을 구별하게 해주는 또 한가지의 차이점이죠.

의외로 두개 언어의 차이점을 잘 인지못하시고 사용하는 분들이 많이 계시더군요...

lacovnk의 이미지

-_-; wrote:
java 는 클래스 단위 가시성이 아닙니다..

그것이 자바와 C++ 을 구별하게 해주는 또 한가지의 차이점이죠.

의외로 두개 언어의 차이점을 잘 인지못하시고 사용하는 분들이 많이 계시더군요...

음. 그렇다면 자바는 private이면 같은 class더라도 다른 instance이면 접근할 수 없나요?

익명 사용자의 이미지

lacovnk wrote:
-_-; wrote:
java 는 클래스 단위 가시성이 아닙니다..

그것이 자바와 C++ 을 구별하게 해주는 또 한가지의 차이점이죠.

의외로 두개 언어의 차이점을 잘 인지못하시고 사용하는 분들이 많이 계시더군요...

음. 그렇다면 자바는 private이면 같은 class더라도 다른 instance이면 접근할 수 없나요?

당근빠따 말밥입니다! ^^
이제부턴 자신있게 말합시다!

익명 사용자의 이미지

손님님 wrote:
lacovnk wrote:
-_-; wrote:
java 는 클래스 단위 가시성이 아닙니다..

그것이 자바와 C++ 을 구별하게 해주는 또 한가지의 차이점이죠.

의외로 두개 언어의 차이점을 잘 인지못하시고 사용하는 분들이 많이 계시더군요...

음. 그렇다면 자바는 private이면 같은 class더라도 다른 instance이면 접근할 수 없나요?

당근빠따 말밥입니다! ^^
이제부턴 자신있게 말합시다!

아닙니다. 자바 역시 C++과 마찬가지로 class 단위 가시성입니다.

아래 코드 컴파일해세요.

public class A
{
        public static void main(String[] args)
        {
                A a1 = new A("hello");
                A a2 = new A("world");
                a1.method(a2);
        }

        public A(String data)
        {
                this.data = data;
        }

        public void method(A a)
        {
                System.out.println(a.data);//world
        }

        private String data;
}
[/code]
무나무나의 이미지

class CTest
{
public:
    CTest()    {
        m_nData = 0;
    }
    int GetData() { return m_nData; };
    void SetData(int nData) { m_nData = nData;};

private:
    int m_nData;
};

int _tmain(int argc, _TCHAR* argv[])
{
    CTest tst;
    int x = 0;

    cout     memset(&tst, 1, 1);
    cout

    tst.SetData(10);

    cout     memcpy(&x, &tst, 1);
    cout     return 0;
}

참조는 참조입니다... ;;; 대략 난감하지만..;;

할롱~ ^_^)/

pung96의 이미지

글쓰는 장소가 좀 엄하기는 합니다만..

SPAM 모듈이 리소스를 너무 많이 차지한다면
차선책으로 captcha은 어떨까요.

어찌어찌 운영진 귀에 들어갈 것으로 기대하면서 소심하게 써봅니다.

권순선의 이미지

음... 사용자 등록시에만 쓸 수 있는 것인 줄 알았는데 답글에도 쓸 수 있군요! 좋은 정보 감사합니다. 확인해 보고 적용하도록 하겠습니다.

권순선의 이미지

지금 확인해 보니 4.6.5에서 사용하려면 패치가 필요한데 아직 제대로 된 패치가 없는듯 합니다. 4.7로 업그레이드하면 적용토록 하겠습니다. 감사합니다...

pung96의 이미지

오~ 읽으셨군요~.. 감동받았습니다.

4.6.5에서 안되는건 몰랐네요.. 빨리 4.7이 릴리즈 되었으면 좋겠습니다.
목이 빠져라 기다리고 있어요

...의 이미지

그런데 참 궁금합니다. 어찌 이 글타래에만 계속 스팸이 달리는 걸까요? 궁금하네...

댓글 달기

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