C ++创建静态对象而不构造它(没有分配)

时间:2017-09-12 19:24:01

标签: c++

我正在编写无法使用内存分配的嵌入式代码! 此外,静态对象(因此在微控制器执行主要功能及其所有初始化之前构建)应在初始化之后在主体内构建,而不是之前。

人们建议的唯一解决方案是在初始化期间使用静态对象指针并分配(用new构造它们)。因为这对我来说不是一个选择,难道没有其他解决方案吗?

我想做的事情如下:

class A
{
public:
  A(int a, bool b)
  : myVal1(a), myVal2(b)
  {

  }
private:
  int myVal1;
  bool myVal2;
}

class B
{
public:
  B(char x)
  : myChar1(x) // <-- NO CONSTRUCTION, NO PARAMETER OF MYOBJECTA
  {

  }

  void init()
  {
    // now i wanna construct myObjectA
    myObjectA(123, false);
  }
private:
  char myChar1;
  A myObjectA; // <-- NO CONSTRUCTION, NO PARAMETER
}

static B myObjectB('F'); // <-- NO CONSTRUCTION, NO PARAMETER OF MYOBJECTA

void global_init()
{
// ... do before construction      

  // now i wanna construct myObjectA
  myObjectB.init();

  //... do after construction
}

2 个答案:

答案 0 :(得分:0)

你有提升吗?

#include <boost/optional.hpp>

class A
{
public:
  A(int a, bool b)
  : myVal1(a), myVal2(b)
  {

  }
private:
  int myVal1;
  bool myVal2;
};

class B
{
public:
  B(char x)
  : myChar1(x) // <-- NO CONSTRUCTION, NO PARAMETER OF MYOBJECTA
  {

  }

  A& getA() {
      assert(myObjectA);
      return myObjectA.get();
  }

  void init()
  {
    // now i wanna construct myObjectA
    myObjectA.emplace(123, false);
  }
private:
  char myChar1;
  boost::optional<A> myObjectA; // <-- NO CONSTRUCTION, NO PARAMETER
};

static B myObjectB('F'); // <-- NO CONSTRUCTION, NO PARAMETER OF MYOBJECTA

void global_init()
{
// ... do before construction      

  // now i wanna construct myObjectA
  myObjectB.init();

  //... do after construction
}

int main()
{
    global_init();
}

答案 1 :(得分:0)

您可以使用足够大的存储空间来创建A的实例和新的位置来控制您创建它的时间。
举个例子:

的#include     的#include

struct A {
    A(int a, bool b): myVal1(a), myVal2(b) {}

    void foo() {}

private:
    int myVal1;
    bool myVal2;
};

struct B {
    B(char x): myChar1(x) {}
    ~B() { if(ptr) { ptr->~A(); } }

    void init() {
        ptr = new (&storage) A{123, false};
    }

    A * myObjectA() {
        return ptr;
    }

private:
    char myChar1;
    std::aligned_storage_t<sizeof(A), alignof(A)> storage;
    A *ptr{nullptr};
};

static B myObjectB('F');

void global_init() {
    // ... do before construction      

    // now i wanna construct myObjectA
    myObjectB.init();

    //... do after construction
}

int main() {
    global_init();
    myObjectB.myObjectA()->foo();
}

这不会分配内存(如果我对你的意思是正确的),A的实例实际上是在B::init内创建的(似乎从你在问题中所写的内容中得到的要求。)

如果您可以访问支持C ++ 17的编译器,或者您可以使用C ++ Boost库,std::optional是另一个答案中建议的有效替代方法。无论如何,你没有指定要遵守的标准的修订版,所以......无论如何,这是一种方法。