기본 클래스 초기화 중에 얻은 파생 클래스 정보에 어떻게 저장할 수 있습니까?

StackOverflow https://stackoverflow.com//questions/22016200

문제

기본 클래스를 초기화하기 위해 데이터가 나오는 부작용으로 파생 클래스는 나중에 인터페이스를 통해 사용할 수있는 정보를 계산합니다. 다음은 정보가 원하는 정보로서 부울을 사용하여 문제에 대한 아이디어를 제공합니다.

class base {
public:
  base(some_initialization_data);
  // ... 
};

class derived : public base {
public:
  derived()
  : base(calc_init_data())
  {
  }

  bool condition_x_occurred() const
  {
    // How to get at the information obtained 
    // during the call to calc_init_data()? 
  }
private:
  static some_initialization_data calc_init_data()
  {
    // This piece of information will later be needed: 
    const bool condition_x_occurred = /* ... */;
    return some_initialization_data(condition_x_occurred);
  }
};
.

이 문제는 파생 클래스 '자체 데이터 구성원이 초기화되기 전에 기본 클래스 초기화 중에 중요한 정보가 계산된다는 것입니다. 따라서 아직 파생 클래스의 데이터 요소에 쓰지 않아야합니다. 지난 20 년 동안 나는 지난 20 년 동안 내가 밝혀지지 않은 행동을 피하는 것을 피하고 싶습니다.

문제의 정보는 기본 클래스로 전혀 수행 할 필요가 없으므로 기본 클래스에 저장하는 것은 옵션이 아닙니다. 또한, 정보는 정적 데이터 멤버에 저장 될 수 없다. 나는 이것을 할 수 있도록 코드를 리팩토링하는 방법에 대한 몇 가지 아이디어가 있지만, 내가 일어날 수있는 것들은 그런 작은 문제에 대해 꽤 방해가 될 수 있습니다. 그래서 나는 당신이 뭔가 간단하게 일어날 수 있는지 궁금합니다.


메모 : 우리는 임베디드 플랫폼에 있기 때문에 GCC 4.1.2로 멈췄다. 너무 엄격하게 C ++ 03 (TR1 포함)이지만 C ++ 11이 아닙니다.

도움이 되었습니까?

해결책

C ++ 11에서는 다음과 같이 할 수 있습니다 :

class derived : public base {
public:
  derived() : derived(calc_init_data()) {}

  bool condition_x_occurred() const { return my_condition_x_occurred; }

private:
    derived(const std::pair<bool, some_initialization_data>& p) :
        base(p.second), my_condition_x_occurred(p.first)
    {}

  static std::pair<bool, some_initialization_data> calc_init_data()
  {
    // This piece of information will later be needed:
    const bool condition_x_occurred = /* ... */;
    return std::make_pair(condition_x_occurred, some_initialization_data(condition_x_occurred));
  }

private:
    bool my_condition_x_occurred;
};
.

C ++ 03에서 파생 된 클래스를 다음과 같이 변경할 수 있습니다.

class derived : public base {
public:
  static derived make_derived() { return derived(calc_init_data()); }

  bool condition_x_occurred() const { return my_condition_x_occurred; }

private:
    derived(const std::pair<bool, some_initialization_data>& p) :
        base(p.second), my_condition_x_occurred(p.first)
    {}

  static std::pair<bool, some_initialization_data> calc_init_data()
  {
    // This piece of information will later be needed:
    const bool condition_x_occurred = /* ... */;
    return std::make_pair(condition_x_occurred, some_initialization_data(condition_x_occurred));
  }

private:
    bool my_condition_x_occurred;
};
.

다른 팁

컴파일러에서 사용할 수있는 경우 위임 생성자를 사용할 수 있습니다.

struct derived_init
{
    bool data;
    some_initialization_data calc()
    {
        data = true;
        return some_initialization_data();
    }
};


class derived : public base {
public:
    derived()
        : derived(derived_init{})
    { }

    bool condition_x_occurred() const
    {
        return init_data.data;
    }
private:
    derived(derived_init init)
        : base(init.calc()), init_data(init)
    { }
    derived_init init_data;
};
.

C ++ 03 기본 인수를 사용할 수 있습니다.

class derived : public base {
public:
    derived(derived_init init = derived_init{})
        : base(init.calc()), init_data(init)
    {
    }
private:
    derived_init init_data;
};
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top