2010-06-16 3 views
1

Qt 4.5를 사용하고 있으므로 C++을 사용하고 있습니다. 난 내가 다른 클래스를 가지고있는 m_ModelDetailsList;게터가 다른 클래스의 구조체 변수를 선언 할 때

내가 getModelDetailsList() 함수를 호출합니다 CClassStructureUsage을, 말을 채 웁니다 기능을 가지고이이

class CClass1 
    { 
     private: 
       struct stModelDetails 
       { 
         QString name; 
         QString code; 
         ..... // only variables and no functions over here 
       }; 
       QList<stModelDetails> m_ModelDetailsList;   

     public: 
       QList<stModelDetails> getModelDetailsList(); 
       ...    
    }; 

같은 클래스가 있습니다. 이제는 QList를 탐색하고 각각 stModelDetails에서 name, code을 얻어야합니다.

이제는 CClass1의 헤더 파일이 포함되어 있습니다.CClassStructureUsage에서 stModelDetails의 유형을 식별 할 수 없습니다. 선언되지 않은 식별자 : 나는

QList<stModelDetails> ModelList = obj->getModelInformationList(); 

에 의해 구조 목록을 얻을 때 그것은 stModelDetails을 말한다.

구조에서 값을 가져올 수 있습니까? 내가 여기서 잘못하고있는거야?

답변

2

이미 문제를 직접 공격하는 방법에 대한 몇 가지 제안 사항을 얻었습니다. 그러나 나는 잠시 동안 뒤로 물러나서 당신이 여기서 성취하고자하는 것을 고려할 것을 권고합니다. 먼저 이라고 말하면 각 stModelDetails의 회원 인 name이 필요합니다. 아마도,

QList<QString> GetModelDetailNames(); 

또는 : 그 바탕으로, 나는 단지 그를 반환하는 기능을 변경하여 시작 했죠

QVector<QString> GetModelDetailNames(); 

전자는 좋은 점 몇 가지가 있습니다. 첫째, 복사해야하는 데이터의 양이 줄어 듭니다. 둘째, 클라이언트 코드가 CClass1의 구현 세부 사항을 더 많이 알 필요가 없도록합니다. 후자는 이러한 장점을 보유하고 자체적으로 몇 가지를 추가합니다. 주로 연결된 목록을 사용하는 이유가 무엇인지 알려주지 않은 상황에서 연결된 목록의 오버 헤드를 피합니다. 정말 상당히 특이한).

외부 코드가 CClass1 내부 데이터의 많은 부분에 액세스해야하는 이유와 CClass1이 데이터에 액세스해야하는 외부 코드 대신 직접 해당 서비스를 제공하는 것이 타당하지 않은지 알아내는 것입니다.

+0

아니요, 구조체의 모든 값을 가져와야하지 않습니다. 방금 코드 예제를 들었습니다. 하지만 두 번째 요점은 유효합니다. 나는 그것을 생각할 것이다. 그러나 헤더 파일에 구조체 선언 만 있고 필요한 경우 포함하는 것이 좋습니다. 시나리오에 대한 예제로 질문을하십시오. – liaK

+1

@liaK : 글쎄, 전체 구조체가 필요할 경우에는 구조체를 정의하는 것이 좋습니다. –

+0

나는 당신이 데이터 액세스를 기반으로 말한 접근 방식에 대한 대답으로 당신의 것을 표시 할 것입니다. – liaK

4

struct stModelDetailsprivate이므로 클래스 외부에서는 볼 수 없습니다. 대신 클래스의 public 섹션에 선언해야합니다 :

class CClass1 
{ 
    private: 
      QList<stModelDetails> m_ModelDetailsList;   

    public: 
      struct stModelDetails 
      { 
        QString name; 
        QString code; 
        ..... // only variables and no functions over here 
      }; 

      QList<stModelDetails> getModelDetailsList(); 
      ...    
}; 
+1

@liaK 당신이 stModelDetails에서 노출하고자하는 것에 따라 당신은 클래스를 만들고 접근 자로 개인 데이터를 보호 할 수 있습니다. –

0

문제는 당신이 개인 클래스로 stModelDetails를 선언한다는 것입니다. 공개 섹션에 넣으면 문제가 해결됩니다.

4

정규화 된 이름 CClass1::stModelDetails을 사용해야합니다. 이제는 비공개라고 말할 것입니다.

0

두 가지 문제가 있습니다 : 1. 이미 언급했듯이 stModelDetails를 클래스의 public 섹션으로 옮겨야합니다. 2. 중첩되어 있으므로 클래스 외부의 적절한 이름은 CClass1 :: stModelDetails입니다.

외부에서 실제로 액세스해야하는 경우 CClass1의 구성원인지 또는 독립 실행 형 클래스 또는 구조체인지 여부를 고려해야 할 수 있습니다. 나는 보통 내 클래스의 구현 세부 사항 인 경우에만 중첩 클래스/구조체를 사용합니다.

관련 문제