簡體   English   中英

如何存儲在基類初始化期間獲得的派生類信息?

[英]How can I store in a derived class information obtained during initialization of a base class?

我的情況是,作為初始化基類的數據的副作用,派生類計算以后必須通過其接口可用的信息。 以下給出了問題的概念,使用布爾值作為所需信息:

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年中遇到的任何平台上使用尚未正式創建的布爾值,但我希望避免調用未定義的行為。

請注意,有問題的信息與基類完全無關,因此將其存儲在基類中是沒有選擇的。 此外,信息不能存儲在靜態數據成員中。 我有一些關於如何重構代碼的想法,以便我可以做到這一點,但是我能想出的所有這些對於這么小的問題似乎都非常具有侵入性。 所以我想知道你們其中一個人能想出​​一些簡單的東西嗎?


注意 :由於我們是在嵌入式平台上,因此我們堅持使用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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM