我的情况是,作为初步效果的侧面效果来初始化基类,派生类可以通过其接口来计算必须以后可用的信息。以下提出了问题,使用布尔值作为所需信息:

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归因
不隶属于 StackOverflow
scroll top