답변:
내부 클래스는 정의 된 클래스의 친구입니다.
그렇습니다. 유형의 객체는 유형 객체의 Outer::Inner
멤버 변수 var
에 액세스 할 수 있습니다 Outer
.
그러나 Java와 달리 유형 Outer::Inner
의 개체와 상위 클래스 의 개체 간에는 상관 관계가 없습니다 . 부모 자식 관계를 수동으로 만들어야합니다.
#include <string>
#include <iostream>
class Outer
{
class Inner
{
public:
Inner(Outer& x): parent(x) {}
void func()
{
std::string a = "myconst1";
std::cout << parent.var << std::endl;
if (a == MYCONST)
{ std::cout << "string same" << std::endl;
}
else
{ std::cout << "string not same" << std::endl;
}
}
private:
Outer& parent;
};
public:
Outer()
:i(*this)
,var(4)
{}
Outer(Outer& other)
:i(other)
,var(22)
{}
void func()
{
i.func();
}
private:
static const char* const MYCONST;
Inner i;
int var;
};
const char* const Outer::MYCONST = "myconst";
int main()
{
Outer o1;
Outer o2(o1);
o1.func();
o2.func();
}
var는 내부 클래스의 멤버가 아닙니다.
var에 액세스하려면 외부 클래스 인스턴스에 대한 포인터 또는 참조를 사용해야합니다. 예를 들어 pOuter-> var는 내부 클래스가 외부의 친구이거나 var가 공용이면 C ++ 표준을 엄격하게 따르는 경우 작동합니다.
일부 컴파일러는 내부 클래스를 외부의 친구로 취급하지만 일부는 그렇지 않을 수도 있습니다. IBM 컴파일러에 대해서는 이 문서를 참조하십시오 .
"중첩 된 클래스는 다른 클래스의 범위 내에서 선언됩니다. 중첩 된 클래스의 이름은 둘러싸는 클래스에 국한됩니다. 명시 적 포인터, 참조 또는 객체 이름을 사용하지 않는 한, 중첩 된 클래스의 선언은 다음과 같은 가시적 구조 만 사용할 수 있습니다. 둘러싸는 클래스 및 전역 변수의 형식 이름, 정적 멤버 및 열거 자.
중첩 된 클래스의 멤버 함수는 일반 액세스 규칙을 따르며 둘러싸는 클래스의 멤버에 대한 특별한 액세스 권한이 없습니다. 둘러싸는 클래스의 멤버 함수는 중첩 클래스의 멤버에 대한 특별한 액세스 권한이 없습니다. "
friend
또는 을 명시 적으로 선언 할 필요가 없습니다 public
. 과거에 IBM이 잘못된 링크에서 잘못되었거나 구식이었던 경우 누가 신경 쓰나요? 이 답변은 게시되기 3 년 전에 이미 구식입니다.
우선, var
C ++에서 허용되지 않는 클래스 외부의 비 정적 멤버에 액세스하려고합니다 .
Mark의 대답이 맞습니다.
Outer의 일부인 모든 것은 외부의 모든 구성원 (공개 또는 비공개)에 액세스 할 수 있어야합니다.
당신은 두 가지, 하나 선언 할 수 그래서 var
등을 static
또는 액세스 'VAR'의 (a 때문에 외부 클래스의 인스턴스의 참조를 사용하는 친구 클래스 또는 함수는 또한 액세스 개인 데이터에 대한 참조를 필요로).
정적 변수
클래스의 인스턴스와 연결 하지 않으려는 경우로 변경 var
합니다 .static
var
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
static int var;
public:
class Inner {
public:
Inner() {
Outer::var = 1;
}
void func() ;
};
};
int Outer::var = 0;
void Outer::Inner::func() {
std::cout << "var: "<< Outer::var;
}
int main() {
Outer outer;
Outer::Inner inner;
inner.func();
}
출력-var : 1
비 정적 변수
객체의 참조는 비 정적 멤버 변수에 액세스해야합니다.
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
int var;
public:
class Inner {
public:
Inner(Outer &outer) {
outer.var = 1;
}
void func(const Outer &outer) ;
};
};
void Outer::Inner::func(const Outer &outer) {
std::cout << "var: "<< outer.var;
}
int main() {
Outer outer;
Outer::Inner inner(outer);
inner.func(outer);
}
출력-var : 1
편집-외부 링크는 내 블로그에 대한 링크입니다.