UFO ET IT

생성자에서 const 필드를 초기화하는 방법은 무엇입니까?

ufoet 2020. 11. 17. 21:27
반응형

생성자에서 const 필드를 초기화하는 방법은 무엇입니까?


C ++ 클래스 Foo와 Foo 포인터가 전달되는 생성자로 생성되어야하는 클래스 Bar가 있다고 가정 해보십시오.이 포인터는 Bar 인스턴스 수명주기에서 변경 불가능한 상태로 유지됩니다. 올바른 방법은 무엇입니까?

사실 아래 코드처럼 쓸 수 있다고 생각했는데 컴파일이 안 돼요 ..

class Foo;

class Bar {
public:
    Foo * const foo;
    Bar(Foo* foo) {
        this->foo = foo;
    }
};

class Foo {
public:
  int a;
};

어떤 제안이라도 환영합니다.


이니셜 라이저 목록에서 수행해야합니다.

Bar(Foo* _foo) : foo(_foo) {
}

(혼란을 피하기 위해 들어오는 변수의 이름을 변경했습니다.)


이니셜 라이저에서해야한다고 생각합니다. 예를 들면 :

Bar(Foo* foo) : foo(foo) {
}

참고로 foo가 가리키는 것을 절대 변경하지 않으려면 참조로 전달하십시오.

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}

const 멤버 및 기타 특수한 경우 (부모 클래스와 같은) 초기화는 이니셜 라이저 목록에서 수행 할 수 있습니다.

class Foo {
private:
   const int data;
public:
   Foo(int x) : data(x) {}
};

또는 유사하게 부모 초기화의 경우

class Foo {
private:
   int data;
public:
   Foo(int x) : data(x) {}
};

class Bar : Foo {
public:
   Bar(int x) : Foo(x) {}
};

이니셜 라이저 목록에서 foo를 초기화해야합니다.

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};

Use a reference:

Foo& foo;
Bar(Foo& f) : foo(f) { }

You can then refer to foo easily in Bar:

foo.doSomething();

try: Bar(Foo* xfoo) : foo(xfoo) {}

참고URL : https://stackoverflow.com/questions/1423696/how-to-initialize-a-const-field-in-constructor

반응형