2014-04-01 2 views
-8

을 부여했다고 가정 : 기능 foo()에서우리는 우리는 우리는 다음과 같은 기능을 제공했다고 가정 우리는 다음과 같은 기능

class MyClass 
{ 
    MyClass(double var) { 
     this->var = var; 
    } 
protected: 
    double var; 
}; 

MyClass foo(MyClass1 obj) { 
} 

우리는 obj.var에 접근 할 수 싶습니다. 그러나 어떻게? 우리가 게터 getVar() 더 이상 생성 할 수 있도록 우리는 다시 키워드 double를 사용할 수 없습니다, 우리는 또한 MyClass 의 친구로 우리의 기능 foo()을 할 수 없습니다, foo()는 방법이 될 수 없습니다.

+3

가능한 솔루션을 제외하고있는 이유는 무엇입니까? 'double'키워드는 원하는만큼 여러 번 사용할 수 있습니다. 그걸 써. C++은 친구 기능을 지원합니다. 그것을 써. –

+0

확인. 먼저 @juanchopanza의 질문에 답한 다음 왜 우리에게 말해주십시오. 왜 존재하지 않는 제한을 언어에 추가합니까? – ElmoVanKielmo

답변

0

클래스 외부의 보호 된 구성원이나 파생 된 개체에 액세스 할 수 없습니다. MyClass을 직접 변경할 수는 없지만 protected 값에 액세스하려는 경우 getter를 정의하는 다른 유형을 사용하여 값을 상속 할 수 있습니다.

class MyClass 
{ 
public: 
    MyClass(double var) : member_var(var) {} 
protected: 
    double member_var; 
}; 
class OtherClass : public MyClass 
{ 
public: 
    OtherClass(double var) : MyClass(var) {} 
    double get_member(void) const { return member_var; } 
}; 

foo에 대해 파생 클래스를 사용할 수 있습니다.

OtherClass foo(OtherClass obj) 
{ 
    double x = 5.0 + obj.get_member(); 
} 
1

Makr MyClass1 멤버 함수를 통한 MyClass 공공 액세스를 제공 MyClass::var의 서브 클래스 :

MyClass1 : public MyClass 
{ 
public: 
    auto v()->decltype((var)) // returns a reference to var 
    { 
    return var; 
    } 
}; 

이것은 MyClass::MyClass(double) 생성자 것이 필요하다는이어서

MyClass foo(MyClass1 obj) { 
    obj.v()++; // increments var 
    return obj; 
} 

참고 비공개.

또 다른 방법은 파생 클래스에서 var을 공개하는 것입니다. 그러나 실제 코드로이 작업을 수행하면 다음과 같은 몇 가지 질문을하지 말고 직접 질문해야합니다.

MyClass1 : public MyClass 
{ 
public: 
    using MyClass::var; // look! var is now public 
}; 

MyClass foo(MyClass1 obj) { 
    obj.var++; // increments var 
    return obj; 
} 
+0

이것은'MyClass'의 생성자가 private이기 때문에 작동하지 않을 것입니다. –

+0

@ RaymondChen 맞습니다. 나는 오타라고 생각했다. – juanchopanza

+0

또한 'double'키워드를 사용합니다. –