2010-08-13 4 views
2

클래스가 있는데 배열이 비공개로 설정되어 있습니다. get_array() 기능을 어떻게 만들 수 있습니까? 나는 우리가 알고있는 것처럼 arr [0]의 포인터를 반환해야한다는 것을 알고 배열을 어떻게 반환하겠습니까?하지만 이것이 개인 규칙을 위반하지는 않았습니까? 이 배열을 반환하는 다른 방법이 있습니까?개인 배열 반환

실제로 배열에 배열 2가 있다고 생각한 다음 클래스 함수를 사용하여 배열을 편집합니다. 위의 경우 작동하지 않으면 계획 B가 될 것이라고 생각합니다.

+2

질문은 아직 완전하지 않습니다. 배열이 무엇을 나타내는 지, 클래스가 무엇을 나타내는 지, 클래스 외부의 코드가 필요한지, 배열의 범위가 어느 정도인지 ... 간단한 정답을 제공하기가 어렵다. 액세스를 제공하면 캡슐화가 중단되는지에 대한 오히려 액세스 제공 방법 *에 대한 대답이 제공됩니다. –

답변

0

나는 C++로 표준 : : 벡터 대신 배열을 사용할 수 있습니다. 기본 (vector<whatever> getter(){ return foo;})처럼 반환 할 수 있으며 처리하기가 쉽습니다.

+0

@anjruu : 어느 것이 정상적인 배열이나 벡터에서 더 잘 생각합니까? p.s (고정 배열을 사용하고 있으므로 확장 성 옵션이 필요하지 않습니다) –

+0

벡터는 일반 자동 배열보다 약간 비쌉니다. 차이점은 단일 메모리 할당과 액세스시 추가 역 참조 인 점입니다. 즉, 생성 중에 벡터 크기를 제공하거나 적절한 크기로 크기를 조정하면됩니다. 이제 값으로 벡터를 반환하면 모든 객체를 복사 *하므로 * 성능에 큰 영향을 미칠 수 있습니다. 일반적인 경우 내부 벡터에 대한 상수 참조를 반환합니다. 그런 다음 다시 배열을 참조로 제공하는만큼 내부 상태가 누출됩니다. –

+0

고정 길이 배열을 사용하는 경우 David Rodriguez에 동의합니다. 배열을 벡터보다 사용하는 것이 좋습니다. –

1

함수에서 배열을 반환 할 수 없습니다. 말하자면 배열의 첫 번째 요소에 대한 포인터를 반환 할 수 있지만 클래스 외부에서 배열의 크기를 얻기 위해 별도의 기능이 있어야한다는 단점이 있습니다.

더 나은 옵션은 배열이 들어있는 구조체를 반환하는 것입니다. 가장 쉬운 방법은 array 클래스를 사용하는 것입니다.이 클래스는 in Boost이며 많은 표준 라이브러리 구현에서 찾을 수 있습니다. 예를 들어

,

class C 
{ 
public: 
    typedef boost::array<int, 5> ArrayType; 
    ArrayType get_array() const { return array_; } 

private: 
    ArrayType array_; 
}; 
+0

예 코드에서 단순함을 강조하지 않았고 다른 libs에 의존하기를 원하지 않았습니다. –

+0

@ismail : 자신 만의 boost :: array를 작성하는 것은 간단합니다. 비교적 최신의 컴파일러를 사용하면 std의 일부가됩니다. 꼭 필요한 경우가 아니라면 내장 배열을 사용하지 마십시오. – Puppy

+0

@ismail : Boost.Array 헤더는 거의 자체 포함되어 있으므로 Boost에서 꺼내서 비교적 쉽게 독립적으로 사용할 수 있어야합니다. 또는 쉽게 다시 작성할 수 있습니다. 꽤 간단한 수업입니다. –

0

읽기 전용으로 만들기 위해 배열에 대한 const 참조를 반환합니다. 클라이언트가 악하지 않는 한

const ArrayType& ma = myClass->get_array();

, 그들은 배열을 수정할 수 없습니다. :-) 명확성을 위해, 배열을 가진 클래스와 배열 자체는 사용하는 동안 범위를 벗어날 수 없습니다.

오타 위해 편집되었습니다.

1

순수 OO 관점에서 볼 때 실제로 누가 클래스의 개인 변수를 사용할 것인가에 달려 있습니다. 친구 클래스 또는 다른 신뢰할 수있는 엔터티 인 경우 개인 데이터 멤버에게 전달하는 데 문제가 없습니다.

1

몇 가지 작업을 수행 할 수 있습니다.

가장 간단한 방법은 const 인 첫 번째 요소에 대한 포인터를 반환하는 것입니다. const int* get_array(void) const; 크기를 쿼리하는 함수를 만들 수도 있습니다.

보다 나은 옵션은 배열에 const 참조를 반환하는 것일 수 있습니다. 간단하게하기 위해 typedef를 사용

typedef int array_type[10]; 
const array_type& get_array(void) const; 

또 다른 옵션은 boost::array처럼 wrap the array up이다. 원하는 경우 Boost의 머리글을 복사하여 붙여 넣을 수 있습니다. array.hpp :

typedef boost::array<int, 10> array_type; 
const array_type& get_array(void) const;