2012-10-18 3 views
0

C++에서 올바른 포인터에 대한 포인터입니까? 나는이 질문을 가로 질러왔다 : Pointer to Pointer to Pointer포인터 멤버가있는 객체에 대한 포인터

그러나 그것이 합법적인지 아닌지에 대한 대답은 명확하지 않다. 의 내가 있다고 가정 해 봅시다 :

class A{ 
public: 
    void foo(){ 
     /* ect */ 
    } 
}; 

class B{ 
public: 
    A* a; 
    /* ect */ 
}; 

void Some_Func() { 
    B *b; 

    // besides this looking ugly, is it legal c++? 
    b->a->foo(); 
}; 

이 라인 b->a->foo()가 작성 OK인가? 이 표현을 표현하는 더 좋은 방법이 있습니까?

+1

'foo'와'a'가 각각의 클래스에서 비공개라는 점을 제외하고는 (public으로 만들어야합니다.) 왜 괜찮지 않을까요? 사실 특히 추한 것은 아닙니다. – jogojapan

+1

왜 그렇지 않습니까? 포인터는 다른 유형과 마찬가지로 유형입니다. – chris

+1

그들은 완벽하게 괜찮지 만 B 클래스의 개인 회원 인 것처럼 'b'(b-> a)에서 'a'에 직접 액세스 할 수 없습니다. 그렇지 않으면 작동합니다. – Skandh

답변

2

이것은 당신이 "을 포인터에 포인터"를 사용하고있는 용어는 잘못된 완벽하게 valid.But입니다.

이 용어는 다른 포인터의 주소를 보유하는 포인터 **P, 과 같은 이중 포인터를 의미합니다.

하지만 경우 (클래스 A의) 포인터이다 포인터 (클래스 B의) some_func

+1

"b"는 클래스 A에 대한 포인터를 보유하고있는 클래스 B의 포인터입니다. –

+0

'포인터에 대한 포인터'라는 용어의 사용을 수정 해 주셔서 감사합니다. –

-1

예 그렇다면 **P과 같은 포인터 포인터를 사용해야합니다.
실제로 다른 포인터를 가지고있는 포인터에 접근하고자한다면 이것을 할 수 있습니다. 이것은 C++에서 허용되지만 포인터를 할당 한 경우에만 해당합니다. pointer p

+0

"공개 된 경우에만"을 의미합니까? 대답에서 설명하는 것은 포인터를 가리키는 포인터입니다. 그러나이를 위해서는 질문자가 원래 제안한 '클래스 A'및 '클래스 B'구조가 필요하지 않습니다. – jogojapan

+0

하지만 우리가 지정했다면이 줄은 참이어야합니다. b-> a-> foo() – khan

+0

여전히 원래 예제에 대해 이야기하고 있다면 포인터에'A ** a'가 필요합니다. 이 경우'P'를 의미 함)'foo'를 호출하는 방법은'(** a) .foo()'또는'(* a) -> foo()'입니다. – jogojapan

0

"a" 비공개입니다. "foo"도 마찬가지입니다.

"public"으로 수정하면 법적 구성입니다.

코드에서 "더 나은"방법을 찾기가 어렵습니다. 하지만 당신은 코드를 만들 수있는 코드를 수정할 수 있습니다 더 명확하게 볼 :

class A{ 
public: 
    void foo(){ cout << "Work";} 
}; 

class B{ 
private: 
    A *a; 
public: 
    A& getA(){ 
     return *a; 
    } 
}; 

void SomeFunction() 
{ 
    B *b = new B(); 
    B& bRef = *b; 
    bRef.getA().foo(); //better looking code? 
     delete b; 
} 
+0

사람이 내려 투표하면. 왜 그런지 신경 써라. 감사! –

0

당신에 의해 만들어진 그것은 법적으로 허용되지만 귀하의 예제에서 프로그램이 충돌하는 클래스의 멤버 (이다 당신의 회원이 개인이기 때문에 당신이 B

void Some_Func() { 
    B *b; // uninitialized B ptr should be B* b = new B; 

    // legal 
    b->a->foo(); 
}; 

의 인스턴스를 생성하지 않았기 때문에 당신이 개인 멤버 변수를 액세스하기 위해 당신이 할로 직접 변수에 접근 재고 대신 게터/세터를 할 수 있지만 당신은) 그것을 컴파일 할 수 있다면 .