【问题标题】:Can i construct a linked list with curly braces?我可以用花括号构造一个链表吗?
【发布时间】:2014-05-07 06:55:35
【问题描述】:

我对面向对象的 C++ 相当陌生,我正在尝试以这种方式为链表创建构造函数:

在 List.h 的某个地方,我们会有这个:

struct Node
{   
    int data;
    Node *next;
}; 

然后在 main.cpp 中,我希望能够构建一个这样的列表:

int main()
{
List A({1,2,3,4,5,6});// I want the amount of numbers to indicate the size of
 //the list and the numbers to go into each node in order
return 0;    
}

所以我的问题是,我可以制作这样的构造函数吗?如果是,那怎么办?我必须使用模板吗?我试图在 SO 中找到这样的问题,但它们都包含模板,我还没有学会。如果我可以让我的构造函数做到这一点,是否可以不使用模板来做到这一点?

【问题讨论】:

  • 我认为这在 C++11 中是可能的。
  • @payo 那将是一个模板
  • {1,2,3,4,5,6} 是一个数组,所以如果你创建一个构造函数,它接受一个数组并创建应该工作的列表。
  • @JerryJeremiah 不,不是。这是一个初始化列表,但绝对不是数组。

标签: c++ linked-list copy-constructor singly-linked-list curly-braces


【解决方案1】:

是的,您可以这样做(使用 C++11)。

您需要定义一个采用std::initializer_list<int> 的构造函数。 (是的,这是一个模板,但我会告诉你如何使用它。:-))

std::intitializer_list<int>-constructor 的可能实现如下所示:

//in class List:
List (std::initializer_list<int> init) {
    for (auto v : init)
        this->emplace_back(v);
}

您必须自己实施emplace_back 作为练习。 emplace_back 应该构造一个新的Node 并将其附加到List。这将是一个有用的成员函数(我保证)。

可能不重要的通知: 如果emplace_back 进行堆分配,则此代码可能会泄漏。在这种情况下,委托给将List 置于有效状态的构造函数,因此析构函数可以释放所有堆分配的Nodes。 如果您不理解这一点,它很可能对您的应用程序不太重要。

【讨论】:

  • 刚刚注意到:this-&gt; 是多余的,但不会造成伤害。
  • 不错。对于生产质量代码,值得一提的是,这种构造函数需要强大的异常保证。也就是说,与std::uninitialized_copy 类似,如果emplace_back 抛出,则必须销毁/删除所有先前构造的对象。
【解决方案2】:

您需要一个接受std::initializer_list 的构造函数。在此处查看示例:http://en.cppreference.com/w/cpp/utility/initializer_list

【讨论】:

    【解决方案3】:

    不是真的。我相信花括号中数字列表的声明会使编译器感到困惑。最好声明一个 int 数组并将其传递给一个构造函数,该构造函数接受一个 int 数组和一个大小变量考虑以下内容:

    int aray[] = {5,6,11,22,11};
    int size   = sizeof(aray)/sizeof(int);
    
    MyList(size,aray);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2020-05-28
      • 2019-02-09
      相关资源
      最近更新 更多