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

C++11 Initialization of a list of pointers to objects

本文关键字:指针 列表 对象 初始化 C++11      更新时间:2023-10-16

EDIT:这个结构是真正的糟糕设计,不要使用它!

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

例如,假设我想创建以下类型的my_list

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

我想用原始值初始化它。

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

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

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

是的,当然:

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"} } },
};

这是糟糕的设计。别这样。

旧帖子,但可能有用你可以在 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 立即浮现在脑海中。和许多其他地方。

看看栈流讨论自引用结构定义?

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

正如你在上面的帖子中看到的那样,列表中没有什么本质上的坏处,它们只是使用起来很棘手,使用它们的方法不像过去那样严格。

你经常尝试的糟糕语法(例如)只是C/C++语言的工件,它不是为了在代码中轻松表示指针列表而设计的。

您也可以尝试以下形式

MyList a = {"A",(MyList *) 0};
MyList b = {"B",&a);

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

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

你可以在Java中找到很多这样的内容,那里有很好的容器类库。缺点是您的启动可能需要额外的几毫秒。

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

玩得愉快克里斯