初始化指针的常数向量

问题描述 投票:1回答:1

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

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,因为应用程序在所有运行时都需要此信息。

c++ c++11 stl embedded
1个回答
0
投票

鉴于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创建。

© www.soinside.com 2019 - 2024. All rights reserved.