在没有堆的情况下用两种方法构造对象

Constructing object in two ways without heap

本文关键字:方法 两种 对象 情况下      更新时间:2023-10-16

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

Object(Obj & obj1, Obj & obj2);

Object(int obj1_initval, int obj2_initval);

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

这将用于裸金属系统,在那里我们负担不起堆。

构造函数与是否在堆上分配对象无关。使用new在堆上分配对象,如果不使用new(直接或间接(,则不会在堆上配置对象。

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

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

这让我想起了std::string_viewstd::string

为了实现这一点,内部存储Obj的实例的类Object可以从仅引用Obj的实例(必须存储在任何地方(的基类ObjectView导出。

一个小样本:

#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 }

coliru上的实时演示