对于我的项目,我需要ComplicatedClass
在阵列中存盘指向型别物件的指标。该阵列Storage
与我在此处省略的其他信息一起存盘在一个类中。
这是我想要做的(这显然不起作用,但希望能解释我想要实作的目标):
class ComplicatedClass
{
...
}
class Storage
{
public:
Storage(const size_t& numberOfObjects, const std::array<ComplicatedClass *, numberOfObjects>& objectArray)
: size(numberOfObjects),
objectArray(objectArray)
{}
...
public:
size_t size;
std::array<ComplicatedClass *, size> objectArray;
...
}
int main()
{
ComplicatedClass * object1 = new ComplicatedClass(...);
ComplicatedClass * object2 = new ComplicatedClass(...);
Storage myStorage(2, {object1, object2});
...
return 0;
}
我正在考虑的是:
- 使用
std::vector
代替std::array
. 我想避免这种情况,因为我的程序的某些部分不允许在空闲存盘上分配存储器。据我所知,std::vector
必须这样做。作为一个加号,我可以放弃size
。 - 更改
Storage
为类模板。我想避免这种情况,因为那样我的代码中到处都是模板。这并不可怕,但它会使使用的类的Storage
可读性低得多,因为它们还必须具有模板化函式。
我还缺少其他任何选项吗?
uj5u.com热心网友回复:
通过动态创建物件。最方便的解决方案是使用std::vector
.
这是行不通的。模板自变量必须是编译时常量。非静态成员变量不是编译时常量。
std::vector
不一定需要使用免费商店。像所有标准容器(除了std::array
)一样,std::vector
接受一个分配器。如果您实作了一个不使用 free-store 的自定义分配器,那么您的要求就可以得到满足。
或者,即使您确实使用了默认分配器,您也可以以这样的方式撰写您的程序,即仅在程序中允许从自由存盘分配的部分中将元素插入到矢量中。
这些只是同一件事的不同词。“免费存盘”是 C 中使用的术语。它通常被非正式地称为“堆存储器”,因为“堆”是一种有时用于实作它的资料结构。
uj5u.com热心网友回复:
从 C 11 开始,std::vector
有data()
访问矢量用于存盘的底层阵列的方法。
在大多数情况下, astd::vector
可以类似于阵列使用,允许您在需要时利用大小调整容器质量,std::vector
或者在需要时将其用作阵列。见https://stackoverflow.com/a/261607/1466970
最后,您知道可以使用矢量代替阵列,对吗?即使函式需要 c 样式阵列,您也可以使用矢量:
vector<char> v(50); // Ensure there's enough space strcpy(&v[0], "prefer vectors to c arrays");
0 评论