在没有堆的情况下用两种方法构造对象
Constructing object in two ways without heap
是否可以提供两个构造函数:
Object(Obj & obj1, Obj & obj2);
和
Object(int obj1_initval, int obj2_initval);
在第二种情况下,obj1和obj2将在编译时分配给.bss?
这将用于裸金属系统,在那里我们负担不起堆。
构造函数与是否在堆上分配对象无关。使用new
在堆上分配对象,如果不使用new
(直接或间接(,则不会在堆上配置对象。
当然,还有其他分配堆内存的方法,例如C中的malloc
。但同样的原则也适用,C++不会为您进行堆分配。
我假设您正在寻找一个对象,该对象确实引用了作为成员包含或不包含的其他对象。
这让我想起了std::string_view
与std::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上的实时演示
相关文章:
- 两种访问I2C总线的方法有什么区别?
- 定义类模板构造函数的两种方法之间的区别
- 初始化类的两种方法?
- 在没有堆的情况下用两种方法构造对象
- 解决虚拟方法的歧义继承的两种方法
- 这两种方法有什么区别?
- 两种专用方法中的相同代码
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- 动态分配一维结构数组:两种方法
- 初始化`rand()的两种方法
- 分配std :: vector元素的两种方法
- 同步QT中两种方法的螺纹执行
- 使用两种不同的方法遍历 Vector 的结果不一致
- 这两种方法有什么区别
- 是否有一种方法可以更准确地确定两种语言中的哪种语言中的哪种方法
- 这两种初始化成员变量的方法之间有区别吗?
- 关于链表,这两种方法有什么不同?C++中的1个自变量与2个自变量
- 两种C++分配方法有什么区别
- 这两种定义方法的样式之间是否存在差异
- 我可以将这两种方法/函数合二为一吗?