C ++ 11初始化对象的指针列表

时间:2014-04-01 04:51:23

标签: c++ pointers c++11 initialization

编辑:这种结构真的很糟糕,不能使用它!

是否可以在C ++ 11中初始化一个指向对象的指针列表(同时初始化所有内容)?

例如,我想说我要创建类型为的my_list

list<pair<string, map<string, string> *> *>

我想用原始值初始化

list<pair<string, map<string, string> *> *> my_list = { ??? }

???:创建指向原始字符串对的指针和指向原始字符串映射的新指针。

为什么我需要这样做:此数据结构存储从文件中读取的配置,但如果找不到该文件,我的代码中需要一个默认值)

2 个答案:

答案 0 :(得分:5)

是的,确定:

list<pair<string, map<string, string> *> *> x {
    new pair<string, map<string, string> *>  {
        "hello", new map<string, string> { {"a", "1"}, {"b", "2"} } },
    new pair<string, map<string, string> *> {
        "world", new map<string, string> { {"a", "1"}, {"b", "2"} } },
};

这是一个糟糕的设计。不要这样做。

答案 1 :(得分:1)

旧帖子,但可能有用 你可以在C中尝试这样的东西,C ++非常相似

Typedef struct {
   char *name;
   int   data;
   struct MyList *next;
} MyList;

Mylist junk[] = {
 {"One"  ,1, &junk[1]},
 {"Two",  2, &junk[2]},
 {"Three",3, (MyList *) 0}
};

MyList *head = &junk[0];

是指向列表头部的指针.....

这些列表在小型嵌入式互操作程序中非常有用且常见。 Lisp和Forth立即浮现在脑海中。和许多其他地方。

查看stackflow讨论self referential struct definition?

列表手术可能是一个问题,因为编译列表可能存在于非易失性存储器中 - 尽管在更现代的CPU中,这可能是闪存。

正如你在上面的帖子中看到的那样,列表中没有什么本质上不好的东西,它们使用起来很棘手,使用它们的方法并没有像过去那样严格地教授。

您经常尝试的可怕语法(例如)只是C / C ++语言的工件,其设计不能简单地表示代码中的指针列表。

您也可以尝试使用

形式的内容
MyList a = {"A",(MyList *) 0};
MyList b = {"B",&a);

另一种常见模式是以编程方式进行初始化

MyList   *m = NewMyList("A");
MyListAdd(m,"B");

你在Java中找到了很多这样的容器类库。缺点是您的创业公司可能需要几毫秒的时间。

另一个常见的用法是在上面的数组示例中使用相对链接...,用sizeof(MyList)替换链接。这使得编程更容易,而且列表变得可重新定位 并且可以使用标准的memcpy类型操作复制(例如从FLASH到RAM并返回)。

玩得开心 克里斯