【问题标题】:C++11 Initialization of a list of pointers to objectsC++11 对象指针列表的初始化
【发布时间】:2014-04-01 04:51:23
【问题描述】:

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

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

例如,假设我要创建my_list,其类型为:

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

我想用原始值初始化它。

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

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

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

【问题讨论】:

  • 是的,这是可能的,但您使用指针可能是一个非常糟糕的设计决策。
  • 我应该在没有指针的情况下存储所有内容吗? (因为我就是这么做的)
  • 这就是我刚才所说的,谢谢
  • 抱歉,误读了。是的,正确,不要使用指针。

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


【解决方案1】:

是的,当然:

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

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

【讨论】:

  • 最后一部分必须大而醒目,颜色要醒目。 :P
  • @cHao:我换35个Unicoins。
  • :p 谢谢,我不会这样做,但知道该怎么做很有趣^_^
  • @toogy:list&lt;pair&lt;string, map&lt;string, string&gt;&gt;&gt; 可能没问题,或者可能更适合手头的实际问题...
  • @KerrekSB:你在想什么?这只是为了存储一个简单的配置文件的内容,在该部分内有多个[section] 和一些key=value。 (我必须使用列表,因为部分可以具有相同的名称)
【解决方案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 立即浮现在脑海中。和许多其他地方。

看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 并返回)。

玩得开心 克里斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2013-06-06
    • 1970-01-01
    • 2011-04-10
    • 2014-03-14
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多