2016-11-30 6 views
1

클래스 A에 멤버 속성이 일부 있다고합니다. A는 클래스 B (std::vector<B>)의 객체를 가진 벡터도 가지고 있습니다. 이러한 B 객체는 A의 속성 중 일부 (5 개)를 필요로합니다.이 작업을 처리하는 두 가지 방법이 있습니다.C++ 클래스의 디자인 : 다른 클래스 멤버의 클래스 멤버의 공용; 작은 인터페이스 대 작은 클래스

1) B가 해당 속성에 대한 참조를 가지고 B의 생성자에 지정하도록합니다.

2) B에 A 객체에 대한 참조 만 있고 public으로 getAttributeXYZ() 함수를 통해 속성을 가져옵니다.

나는 1) 기술적으로 A에 대한 지식이 거의 없다는 것을 알 수 있습니다. 따라서 잘못된 A 함수를 호출 할 수 없기 때문에 더 낫습니다. 하지만 생성자가 작고 B 클래스의 특성 (참조)이 훨씬 적기 때문에 2) 훨씬 더 깔끔한 느낌입니다. 일반적인 더 좋은 방법이 있을까요, 세부 사항에 의존할까요?

컨텍스트 : 내 프로그램에서 A의 멤버는 B 개체 모두가 공유 할 수있는 텍스처 관리, 텍스트 그리기 등을위한 클래스입니다.

+1

# 1은 A에 대해 덜 알고있는 논리를 따르지 않습니다. 속성을 직접 참조하는 경우에도 여전히 A에 종속적입니다. 사실 개인적인 구현에 의존하기 때문에 사실입니다. A에 대한 자세한 내용은 A에 대한 참조를 저장하고 공용 접근 함수라고하면 A와 B 사이의 의존성이 줄어 듭니다. * 논리적으로 종속 된 두 가지 사이의 종속성을 최소화하려고하면 * 어리 석음으로. 가장 이론적으로 순수하지 않더라도 가장 명확한 디자인을 사용하십시오. –

+1

"일반적으로 더 좋은 방법이 있습니까? 아니면 세부 사항에 달려 있습니까?": 세부 정보를 모른 채 어떻게 알 수 있습니까? :) 그렇기 때문에 좋은 질문은 일반적인 질문이 아니라 [MCVE] (http://stackoverflow.com/help/mcve)로 작성되어야합니다. – wasthishelpful

답변

3

이 경우 BA의 관련 하위 집합에만 액세스하여 케이크를 먹을 수도 있습니다. 당신이 이것에 대해 갈 수있는 여러 가지 방법이 있습니다.

한 , 전용 클래스의 속성 수집 :

struct A 
{ 
    struct SharedData 
    { 
    int data; 
    // ... 
    }; 

    A(); 

private: 
    SharedData sharedData; 
    std::vector<B> bs; 
    // other data here 
}; 

struct B 
{ 
    B(A::SharedData *data) : data{data} {} 

private: 
    A::SharedData *data; 
}; 

A::A() : bs{B{&sharedData}} {} 

두를, A에게 이러한 속성에 액세스 할 수있는 전용 인터페이스 제공 :

struct SharedDataInterface 
{ 
    virtual int getData() const = 0; 
}; 

struct A : SharedDataInterface 
{ 
    int getData() override { return sharedData; } 

    A(); 

private: 
    std::vector<B> bs; 
    int sharedData; 
    // other data here 
}; 

struct B 
{ 
    B(SharedDataInterface *data) : data{data} {} 

private: 
    SharedDataInterface *data; 
}; 

A::A() : bs{B{this}} {} 

나는이 주제에 대한 확인 다른 유사 해요됩니다 또한 가능합니다.