我在头文件中具有以下类,这些头类旨在为描述嵌入式环境中系统状态的一组指令创建运行时多态性:
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
限定符,此内存是否仍在动态分配?它存储在匿名名称空间中,供多个状态类使用。因为许多状态类共享相同的元素,所以我想定义向量以供所有人选择以节省代码空间。向量最适合这种行为吗?
P,我不必担心在任何指针上调用delete
,因为应用程序在所有运行时都需要此信息。
鉴于
const
限定符,此内存是否仍在动态分配?
是。 std::vector
内部分配,const
或没有const
都不会更改。
初始化
const vector<foo*>
类型的向量的最佳方法是什么?
Best在这里确实很主观,但通常我喜欢使用两种好方法:
std::initializer_list
;第一个很明显-您已经在使用它。如果您从未使用过第二个方法,那就更麻烦了:
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
创建。