2013-09-21 5 views
0

구조 내의 클래스의 객체를 정의하고 클래스의 함수 멤버에 액세스하려고합니다. 이것을 달성 할 수 있습니까?구조 내의 클래스

다음 코드를 사용하면 ps_test->AttachToInput(2145);에 세그먼트 오류가 발생합니다. 모든

class test 
{ 
public: 
    test(); 
    virtual ~test(); 
    int init_app(int argc, char* argv[]); 
    virtual void AttachToInput(int TypeNumber, int DeviceNo=0); 
} 

struct capture 
{ 
    test h_app; 
    gint port; 
}; 

main() 
{ 
    struct capture h_cap; 
    test *ps_test = &h_cap.h_app; 
    ps_test->AttachToInput(2145); 
} 
+1

무엇이 문제입니까? –

+7

'AttachToInput'은 보호되어 있기 때문에 호출 할 수 없으므로 파생 클래스에서만 사용할 수 있습니다. (Java와 같은 방식으로 작동하지 않습니다.) 그게 당신의 질문입니까? –

+0

"나는 독특한"!? –

답변

4

첫째, class와 C의 struct ++ 사이의 유일한 차이는 클래스의 멤버는 기본적으로 private 것으로하고, 구조체의 : 나는 이유를 알아낼 수 없습니다, 모든 것이 나에게 올바른 보이는 구성원은 기본적으로 public입니다. 프로그래머가 별도로 지정하지 않는 한 컴파일러에서 생성 한 ctors 및 dtors는 두 경우 모두 표시됩니다 (예 : 기본 ctor를 private 섹션으로 이동). 그렇지 않으면 명시된 public 선언 없이는 class으로 표시된 사용자 정의 형식의 인스턴스를 생성하고 파기 할 수 없으므로 컴파일러에서 생성 된 함수의 목적을 무시합니다.

기본적으로 사용자가 수행하는 작업은 단지 구성이며 두 가지 사용자 정의 유형 중 완벽하게 합법적입니다. capture의 인스턴스를 만들면 test의 인스턴스도 만들어집니다. 당신이 하지 수있는 일

공개적으로 test 외부에서 AttachToInput()에 액세스하고 test 유형을 도출한다. 당신의 class testchar에 원시 포인터를 보유하고, 다른에

h_cap.h_app.AttachToInput(); // error: member function of `test` is protected 

, 관련이없는 메모를 (하지만 그래서 난 그것을 언급을 가로 질러 나는왔다) : 당신은 컴파일이 줄을 위해서는 기능 public를 선언해야합니다. 가리키는 개체의 수명이 포인터를 보유하는 개체의 수명을 초과하도록 보장되면 원시 포인터를 보유하는 것이 좋습니다. 그렇지 않으면 개체 자체가 해당 개체를 파괴 할 가능성이 매우 높습니다. 당신은 누가 물건을 소유하고 누가 물건을 할당하고 할당 해제 할 책임이 있는지를 알아야합니다.

EDIT :이 답변을 작성하는 동안 Alan Stokes는 의견 섹션에서 같은 제안을했습니다. :)

EDIT2

: 암시 적 기본 액세스도 클래스 선언 파생 된 방법에 따라 기본 클래스에 대한 약간의 감독을 가정한다. What are the differences between struct and class in C++?을 참조하십시오.

+0

안녕하십니까 Thokra, 도움 주셔서 감사합니다. 그것은 나의 의심의 대부분을 명확하게했다. 지금 내 질문을 업데이트했습니다. 이 문제를 살펴보고이 문제를 해결하는 데 도움을 주시겠습니까? 좋은 날. – Raju

+0

@RajuBabannavar : 당신이 얻는 segfault는 AttachToInput()에 대한 호출 때문이 아닙니다. 함수의 구현을 디버그하고 잘못된 주소에 액세스하지 않는 것이 좋습니다. 스텁 구현에서'AttachToInput()'을 사용하면 예제가 정상적으로 작동합니다. – thokra