2014-11-29 4 views
-1

고유 한 멤버 변수가 포함 된 기본 클래스에서 파생 된 클래스가 있습니다. 캡슐화 된 클래스의 모든 것을 유지하기 위해 동일한 메소드에서이 멤버 변수를 동시에 검색하는 방법에 대한 명확한 접근법을 알아 내려고합니다. 여기에 방법이 모습입니다 (이것은 의사 코드와 아마 컴파일되지 않습니다) : 코드 번호를 호출C++ - 동일한 메서드 내에서 멤버 변수 가져 오기 및 설정?

class Base 
{ 
    virtual void MyVirtualMethod(double &output1, Object &output2) 
    { 
     // do base class stuff (does not set output1 because it does not need to)... 
     output2 = whatever; 
    } 
} 

class Derived 
{ 
public: 
    virtual void MyVirtualMethod(double &output1, Object &output2) 
    { 
     // do derived class stuff... 

     m_DerivedMember = whatever; 

     // do more stuff... 

     output1 = m_DerivedMember; 
     output2 = whatever2; 
    } 

private: 
    double m_DerivedMember; 
} 

코드 # 2

double output1(100); // some default value 
Object output2; 
base->MyVirtualMethod(output1, output2); 

// do more stuff but does not actually use output1, just output2... 

동안 호출 한

std::vector<DataPack> dataPack; 

for each Base pointer... 
{ 
    double output1(100); // some default value 
    Object output2; 
    base->MyVirtualMethod(output1, output2); 

    dataPack.push_back(DataPack(output1, output2)); 
} 

이 작품은, 그것은 단지 내게 깨끗해 보이지 않습니다. 내가 묻는 더 큰 질문은 getter와 setter와 같은 메서드를 동시에 사용하는 것이 좋은가요? 감사!

+0

_ _ 당신은 어떤 게터가없는 "나는 나 자신을 부탁 해요 더 큰 문제는이 ... 게터와 동일한 방법과 세터를 사용하는 것이 좋습니다 여부 것 같다"/setter 함수는 샘플에 표시됩니까? –

+0

동일한 메서드 내에서 멤버 변수를 설정하고 가져 오는 것이 좋습니다. Get 또는 Set 메서드로 레이블이 지정되어 있지 않지만 메서드 내부에서 해당 멤버 변수를 가져 와서 가져옵니다. – Andrew

+0

그건 _state operation_ (getters/setters와는 관계없는 것)이라고하는 것입니다. 그러한 것을 허용하지 않으면, OOP의 전체 개념은 꽤 쓸모 없을 것입니다. –

답변

-1

질문에 대답하기 위해 별도의 getter와 setters가 캡슐화의 핵심입니다. 추가 기능 호출을 절약 할 수 있지만 가져 오기 및 설정을위한 별도의 기능을 갖는 것이 훨씬 안전하고 안전합니다. 여기에 몇 가지 불통 코드는 더 나은

class Derived : public Base 
{ 
public: 
    virtual void MyVirtualMethod(double &output1, Object &output2) 
    { 
     // do derived class stuff... 

     m_DerivedMember = whatever; 

     // do more stuff... 

     output1 = m_DerivedMember; 
     output2 = whatever2; 
    } 


/* 
The setter 
*/ 
void setDerivedMember(double m){ 
    m_DerivedMember = m; 
} 




/* 
the getter 
*/ 

double getDerivedMember(){ 

    return m_DerivedMember; 
} 


private: 
    double m_DerivedMember; 
} 

을 이해하기 위해 그리고 우리처럼이 함수를 호출 할 수 있습니다 :

Derived d(1.5, string("I'm a string")); 
d.setDerivedMember(5.00); 
cout <<"Derived Member Value: " d.getDerivedMember()<<endl; 

그것은 것 출력 :

Derived Member Value: 5.00 

희망 의미가 있습니다!

0

권장 사항은 아니지만 멤버에게 참조를 반환하면 가져 오기/설정 작업을 모두 할 수 있습니다. 이것은 operator[]에 오버로드하여 std::vector이 작동하는 방식입니다. 뭔가 같은 :

#include <iostream> 
using namespace std; 

class Foo 
{ 
    int m_; 
public: 
    Foo(int m): m_(m){} 
    int& get_set() 
    { 
    return m_; 
    } 
    const int& get_set() const // for const-access 
    { 
    return m_; 
    } 
}; 

int main() 
{ 
    Foo foo(10); 
    cout << foo.get_set() << endl; 
    foo.get_set() = 20; 
    cout << foo.get_set() << endl; 

    // that's why we need the `const` overload of `Foo::get_set` 
    const Foo cfoo(100); 
    cout << cfoo.get_set() << endl; 
}