2014-06-12 4 views
3

다음과 같은 일반 코드가 있는데, 일부 메모리에서 뷰를 구현하는 클래스가 있으며 다양한 방법으로이 클래스를 만들 수 있습니다. 일부 데이터 처리 기능에 일관된 인터페이스를 제공하는 데 사용됩니다. View 방법을 참조 또는 값으로 리턴되어야 하는지를 참조 및 값 및 Const 문제에 의한 C++ 전달

class CView 
{ 
    ... 
    int m_size; 
    float *m_data; 
}; 

class CObjectA 
{ 
    ... 
    CView m_view; 

    const CView View() const { return m_view; } // returned 
    CView View() { return m_view; } // returned 
}; 

class CObjectB 
{ 
    ... 
    const CView View() const { return CView(.....); } // constructed 
    CView View() { return CView(.....); } // constructed 
}; 

void ProcessAdd(CView &dst, const CView &src1, const CView &src2); 
void ProcessReverse(CView &dst, const CView &src); 
void ProcessMul(CView &dst, const CView &src1, const CView &src2); 

는 이제 궁금하고 Process 방법 참조 또는 값을 사용해야하는지 여부도.

컴파일러가 나를보기() 메서드를 만들 수 없습니다 것 같다
CObjectA a1, a2; 
CObjectB b1; 
... init these somehow 
ProcessAdd(a1.View(), b1.View(), a2.View()); 

사본을 반환하고 Process 기능에 참조로 전달합니다 나는 복사를 최소화하지만, 뭔가를 할 수있는 능력을 유지하려는.

View 개체는 상당히 가볍고 읽을 수 있거나 수정할 수있는 데이터를 나타냅니다.

View 방법 대신 CView & 유형의 CView을 반환하는 경우, 이것은 내가이이 Process 함수에 통과 할 때 이중 복사가있을 것이라는 점을 의미 하는가? 원하는 행동을 얻는 가장 효율적인 방법은 무엇입니까?

다른 문제는 const 정확성을 구현하는 올바른 방법은 무엇입니까? 사실 프로세스 함수가 ​​CView 클래스의 멤버 변수를 변경하는 것을 원하지는 않지만 CView 클래스의 데이터 포인터가 출력보기 인 Process의 첫 번째 매개 변수가 아닌 const 데이터를 가리 키도록해야합니다. 값으로 전달하면 아마도 const 한정자를 가질 필요가 없다는 말입니까?

답변

3

당신이 가치에 의해 지나가고 있다면, 그것을 const 값으로 만들 필요가 없다는 것은 맞습니다. 당신이 CView을 반환하고 ProcessAdd, ProcessReverseProcessMul 기능 '인수가 모든 참조이기 때문에, 그것은 다시 복사되지 않습니다 프로세스 함수로 전달할 경우

, 당신의 질문의 첫 번째 부분에 대답합니다. 전달 된 동일한 CView 개체를 사용합니다.

CView 개체를 캡슐화하려는 경우 응용 프로그램에 의미있는 몇 가지 방법이 있습니다. 예를 들어, 다음과 같이 당신의보기 방식을 변경할 수 있습니다 : 당신은 수정하려는 뷰에 대한 다른 참조가있는 경우

const CView& View() const { return m_view; } 

그런 다음 당신은 혼자가 프로세스 기능을 떠날 수 있습니다. 당신이 다른 CView를 조합 새 개체를 만드는 것 같습니다 때문에, 직접 새로운 뷰를 반환하는 기능을 변경할 수 있습니다

CView ProcessAdd(const CView &src1, const CView &src2); 

당신이 값에 의해 당신의 CView의 전부를 통과하고 있을까? 아마. 귀하의 예에서 가지고있는 유형은 작기 때문에 사본으로는 그다지 차이가 ​​없을 것입니다. 오브젝트에 중요한 포인터 소유권 규칙 (있는 것처럼 보입니다)이 있거나 더 많은 정보를 갖기 위해 확장 될 수있는 경우, 처음부터 참조를 사용하고 싶을 것입니다.

+0

만약 프로세스 함수 인수가 값에 의해 전달된다면'CView' 객체는 두 번 복사 될 것입니다 :'View' 메소드에서 한 번, 함수 호출에서 한번 또는 컴파일러가 충분히 똑똑하지 않습니까? – Robotbugs

+0

@Robotbugs 그건 정말 좋은 질문입니다. C++ 표준에 정의되어 있는지 여부 또는 정의되지 않은 상태인지 여부는 확실하지 않습니다. – derekerdmann

+0

@Robotbugs 예가 있습니까? 이 표준은 다양한 상황에서 복사본을 구현할 수있게 해줍니다. 이것은 가장 유명한 컴파일러/플랫폼 조합에서 잘 구현됩니다. 그러나 악마는 그 방식대로 세부 사항에 있습니다. – juanchopanza