初始化指针的常量向量



我在头文件中有以下类,旨在为一组描述嵌入式环境中系统状态的指令创建运行时多态性:

class foo
{
public:
virtual void bar(void) = 0;
virtual ~foo() {}
};
class derived1 : public foo
{
private:
int data1;
public:
void bar(void)
{
//implementation 1
};
derived1(int d) : data1(d) {}
~derived1() {}
};
class derived2 : public foo
{
private:
int data2;
public:
void bar(void)
{
//implementation 2
}
derived2(int d) : data2(d) {}
~derived2() {}
};

初始化const vector<foo*>型向量的最佳方法是什么?我目前正在执行以下操作:

const std::vector<foo*> v =
{   
new derived1(a),
new derived1(b),
new derived2(c),
new derived2(d)
};

给定const限定符,此内存是否仍动态分配?它存储在匿名命名空间中,供多个状态类使用。由于许多状态类共享相同的元素,因此我想定义所有状态类的向量以供选择以节省代码空间。向量是否最适合此行为?

Ps,我不需要担心在任何指针上调用delete,因为应用程序在所有运行时都需要此信息。

给定const限定符,此内存是否仍动态分配?

是的。std::vector内部分配,const或不const不会改变这一点。

初始化const vector<foo*>型向量的最佳方法是什么?

Best在这里真的很主观,但通常有两种我喜欢使用的好方法:

  • 用大括号初始化以使用std::initializer_list;
  • 使用 IIFE(立即调用的函数表达式(;

第一个很明显 - 你已经在使用它。如果您从未使用过,则第二个更棘手:

const std::vector<int> vec = [someFlag]{
std::vector<int> non_const;
non_const.push_back(3);
if (someFlag) {
non_const.push_back(-1);
}
non_const.push_back(7);
return non_const;
}(); // <= notice the call - ()

请注意,您最终会得到一个有条件初始化const std::vector(请注意 lambda 中的if(。诀窍是使用 lambda 和局部非const向量将一些值推送到其中,然后return它。由于强制复制省略,应该只有一个std::vector的构造。编译器可以自由优化(并且可能会(任何矢量副本,因此大多数情况下只有一个std::vector创建。

相关内容

  • 没有找到相关文章

最新更新