2010-03-28 4 views
3

내가 좋아하는 뭔가있어 : 다른 클래스의 기능에구조체를 클래스로 이동하는 방법은 무엇입니까?

typedef struct Data_s { 
    int field1; 
    int field2; 
} Data; 

class Foo { 
    void getData(Data& data); 
    void useData(Data& data); 
} 

을, 나는 할 수 있습니다 만들지 않고 푸 전역에서 그리고로 데이터를 이동하는 방법은

class Bar { 
    Data data_; 
    void Bar::taskA() { 
    Foo.getData(data_); 
    Foo.useData(data_); 
    } 
} 

있는가 새로운 계급? 데이터는 다른 곳에서 사용하고있는 라이브러리에있는 구조체를 반영합니다. (즉, 동일한 필드, 그냥 다른 이름입니다. 나중에 다른 구조체에 데이터 캐스팅 .Foo 추상 클래스 및 라이브러리를 사용하여 파생 된 클래스 많은 단지 하나이기 때문에이 작업을 수행합니다.)

현재 붙여 넣기 클래스 내부에서 DataFoo::Data으로 대체하면 작동하지 않습니다.

class Foo { 
    typedef struct Data_s { 
    int field1; 
    int field2; 
    } Data; 
    ... 
} 

나는 당신은 클래스 내부의 구조체를 정의 할 수 있습니다 Bar data_;

+0

그래서 당신이 Data_s 유사한 클래스를 만들려면? 또는 멤버의 값을 런타임에 클래스에 복사하려고합니까? – Cam

+1

구조체와 클래스 사이에는 몇 가지 차이점이 있습니다. '구조체를 클래스로 이동'하여 무엇을 달성하려고합니까? 정확히 무엇을하려고하는지에 대한 명확한 설명이 도움이 될 것입니다. – stefanB

+0

추가/명확히했습니다. 그게 더 좋은가요? – Kache

답변

4

에서 'Data' in class 'Foo' does not name a type를 얻을 수 있지만, 당신이 먼저 사용 위치를 앞두고 장소의 그것을 할 필요가있다. 구조체는 클래스 자신처럼 그들을 사용하기 위해 앞으로 선언해야합니다

class Foo 
{ 
public: 
    struct Data 
    { 
     int field1; 
     int field2; 
    }; 

    void getData(Foo::Data& data) {} 
    void useData(Foo::Data& data) {} 
}; 

void UseFooData() 
{ 
    Foo::Data bar; 
    Foo f; 
    f.getData(bar); 
    f.useData(bar); 
} 

편집 : 원래의 질문에 나열된 업데이트 예제는 같은 필드/클래스 이름을 사용 할 수 있습니다. Foo 클래스 외부에 표시 되려면 Datapublic으로 선언해야하고 다른 코드는 Foo::Data으로 참조해야합니다.

+1

질문에 Data_s 및 Foo 클래스 구조가 있으므로 질문에 대한 답을 수정할 수 있습니까? –

2

더욱 정확하게 Foo :: Data는 사용자가 제공 한 코드 조각에서 액세스 할 수 없습니다. 클래스 멤버는 기본적으로 개인 공개 상태입니다.

둘째, C++을 사용하는 경우 구조체 선언을위한 typedef는 권장되지 않습니다 (다른 유효한 용도가 있지만 사용법은 아닙니다).

대신이 수정 된 버전을 시도해보십시오

class Foo { 
public: 
    struct Data { 
    int field1; 
    int field2; 
    }; 
    ... 
} 
+0

그냥 궁금해서, 구조 선언을 typedef 때 다음 권장 무엇입니까? – Kache

+0

C++에서 사용하지 마십시오. C에서 typedef를 사용하지 않았다면 "struct that that"라고 말해야 만합니다. typedef를 사용하면 "that"이라고 말할 수 있습니다. C++에서는 struct가 필요 없기 때문에 typedef는 쓸모가 없습니다. Typedef는 특히 템플릿이있는 경우에 다른 용도로 사용되지만 클래스 또는 구조체 정의에 typedef를 사용하면 C++ 프로그래머의 C++ 사용 경험을 빠르게 찾을 수 있습니다. –

+0

사실 저는 C/I로 작성된 minizip 및 unrar 라이브러리의 예를 따르면서 b/c 만하고있었습니다. @ @ – Kache

관련 문제