以前未调用函数时发出错误

时间:2017-11-26 15:38:08

标签: c++ initialization preprocessor assertions

我正在尝试在基于C ++的应用程序中管理初始化函数。我想:

  • 即使多次调用init_some_hw_peripherals(),也要确保init()(见下文)只运行一次。

  • 如果之前没有从对象调用另一个函数doPerform(),则阻止执行函数init_some_hw_peripherals()

我已经想到了以下解决方案,它不起作用(如果没有初始化,我不会收到任何错误消息)。我知道它为什么不起作用而且非常有意义。但是我希望使用这些类型的定义来实现我所提到的。我希望这些信息有所帮助。

如果你能帮助我处理这种情况并给我一些指导,我将不胜感激。

提前致谢。

初始化

void myClass::init(void)
{
#ifndef MY_INIT_
#define MY_INIT_
      init_some_hw_peripherals();
#endif
}

应用

void myClass::perform (void)
{
#ifndef MY_INIT_
#error "You havent initialized. Use myClass::init()"
#else
      doPerform();
#endif
}

编辑:对我使用私有变量的问题是我有几个类可以调用init函数。所以我不想把它变成私有变量。这就是为什么我坚持使用这种解决方案,因为它知道它最初不会起作用。

2 个答案:

答案 0 :(得分:2)

您可以使用私人成员告诉您是否已完成初始化:

class myClass {
public:
    myClass() : isInit(false) {}
    ...
private:
    bool isInit;
};

void myClass::init(void)
{
    if (!init) {
      init_some_hw_peripherals();
      init = true;
    }
}

void myClass::perform (void)
{
    if (!init) {
        cout << "You havent initialized. Use myClass::init()";
    } else {
      doPerform();
    }
}

答案 1 :(得分:0)

通常,类似init的函数的存在表明缺少适当的构造函数。给定的要求显然导致了两个具有专用构造函数的类:

class hwPeripherals
{
      private: static ::std::atomic_bool s_construction_attempted;

      // instead of init_some_hw_peripherals
      public: hwPeripherals(void)
      {
          // Check that no attempts of hwPeripherals construction happened yet.
          if(s_construction_attempted.exchange(true))
          {
               // Throw an exception.
          }
          // Initialization... Throw an exception if fails.
      }
};

class myClass
{
     private: myClass(void) = delete;

     // instead of init
     public: explicit myClass(hwPeripherals & peripherals)
     {
          // Initialization... Throw an exception if fails.
     }

     public: void perform(void);
};

这种调用执行用户的方式首先需要实例化myClass,并且为了做到这一点,用户需要实例化hwPeripherals

hwPeripherals peripherals{};
myClass obj{peripherals};
obj.perform();