没有堆的两种方式构造对象

时间:2018-07-31 10:44:31

标签: c++ embedded

是否可以提供两个构造函数:

Object(Obj & obj1, Obj & obj2);

Object(int obj1_initval, int obj2_initval);

在第二种情况下,在编译时将obj1和obj2分配给.bss吗?

这将用在裸机系统中,在该系统中我们无法承受堆压。

2 个答案:

答案 0 :(得分:1)

构造函数与是否在堆上分配对象无关。您可以使用<tr *ngFor="let template of templates; let j=index ; trackBy:customTrackBy"> <td><b>Template {{j+1}}</b></td> <td><input class="form-control" [(ngModel)]="templates[j]"/></td> </tr> 在堆上分配对象,如果不(直接或间接)使用$objPHPExcel ->getActiveSheet() ->getCellByColumnAndRow($col, $row) ->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); ,则不会在堆上分配对象。

当然,还有其他分配堆内存的方法,例如C中的new。但是同样的原则适用,C ++不会为您分配堆。

答案 1 :(得分:0)

我假设您正在寻找一个对象,该对象确实引用了包含或不包含为成员的其他对象。

这使我想起std::string_viewstd::string

要实现此目的,可以从基类Object派生内部存储Obj实例的类ObjectView,该基类仅引用Obj的实例(可以存储在任何地方)。

一些例子:

#include <iostream>
#include <string>

class Obj {
  private:
    std::string _name;
  public:
    Obj(const std::string &name): _name(name) { }

    const std::string& getName() const { return _name; }
};

class ObjectView {
  private:
    Obj &_obj1, &_obj2;
  public:
    ObjectView(Obj &obj1, Obj &obj2): _obj1(obj1), _obj2(obj2) { }

    Obj& getObj1() { return _obj1; }
    Obj& getObj2() { return _obj2; }
};

class Object: public ObjectView {
  private:
    Obj _obj1, _obj2;
  public:
    Object(const std::string &name1, const std::string &name2):
      ObjectView(_obj1, _obj2),
      _obj1(name1), _obj2(name2)
    { }
};

void print(const char *name, ObjectView &objView)
{
  std::cout << "ObjectView " << name << " { "
    << "obj1: " << objView.getObj1().getName() << ", "
    << "obj2: " << objView.getObj2().getName() << " }\n";
}

int main()
{
  Object object1("o11", "o12");
  print("object1", object1);
  Obj obj1("o21"), obj2("o22");
  ObjectView object2(obj1, obj2);
  print("object2", object2);
  // done
  return 0;
}

输出:

ObjectView object1 { obj1: o11, obj2: o12 }
ObjectView object2 { obj1: o21, obj2: o22 }

Live Demo on coliru