【问题标题】:What constuctor does list initialization use列表初始化使用什么构造函数
【发布时间】:2020-11-03 19:49:20
【问题描述】:

我试图通过创建自己的向量来模仿 stl 向量的实现。我还创建了自己的模仿 std::string 的字符串版本。我需要制作什么样的构造函数才能使用大括号括起来的初始化?目前它说 Vec 没有对 Vec::Vec() 的匹配调用。我猜我必须使用 std::initializer_list 但我不知道从哪里开始。

这是我自己的矢量类版本

class Vec{
private:
size_t vectorSize;
size_t vectorCap;
String * myString; //my own version of string
public:
Vec()
{
myString = nullptr;
vectorSize = 0;
vectorCap = 0;
}
explicit Vec(const String& rightObj) //takes String Object
{
   myString = new String[1];
   myString[0] = rightObj; // = is overloaded
   vectorSize = 1;
   vectorCap = 1;
}
Vec(const Vec & rightObj) //copy constructor
{
   if(this == &rightObj)
    {
      return *this;
    }
   delete[] myString;
   vectorSize = rightObj.vectorSize;
   myString = new String[vectorSize];
   for(auto i = 0; i<vecSize; i++)
   {
     myString[i] = rightObj.myString[i];
   }
   vectorCap = vectorSize;
}
// Vec(std::initilizer_list<String> myL) 


#include<vector>
#include <string>
#include "String.hpp"
#include "Vec.hpp"


int main()
{
   std::vector<std::string> x {"test1", "test2", "test3"}; //what kind of constructor does this use?
   Vec x {"test1", "test2", "test3"}; // I want to do something like this.
}

【问题讨论】:

  • 关于复制构造函数的注意事项:它是一个构造函数,所以不可能匹配 thismyString 不会包含值得 delete[]ing 的地址。更糟糕的是,myString 还没有被初始化,它可能指向你真的,真的不想delete[] 的东西。在你开始添加功能之前,我强烈建议你测试你已经拥有的东西。
  • @user4581301 应该是 if(this == &amp;rightObj) 。如果它通过了这个条件,在myString上调用 delete 是不是安全的@
  • 我的意思是,如果您正在构建对象。您可以自己复制构造的唯一方法是Vec x(x);Vec x = x;。要么是一个非常愚蠢的错误,您应该记录它并中止程序,以使程序员明白错误并强迫他们修复它。
  • 另一方面,在赋值运算符中,这些都是很棒的事情。后面几十个函数调用的模糊a = something _that_refers_to a; 是一个值得警惕的明显可能性。
  • 旁注:Member Initializer List 可以使构造函数更易于编写和维护。如果您有一个没有默认构造函数的类型的基类或成员变量,则非常重要。

标签: c++ string vector constructor


【解决方案1】:
std::vector<std::string> x {"test1", "test2", "test3"}; //what kind of constructor does this use?

它使用接受std::initializer_list的构造函数。

我需要制作什么样的构造函数才能使用大括号括起来的初始化?

一个接受std::initializer_list的构造函数。

但这不是唯一的选择。另一个是对数组的引用。但是这样的构造函数必须是模板函数才能允许数组有多种大小。

更一般地说,另一种选择是让类成为一个聚合类,并且根本没有用户定义的构造函数。但这不是您班级的选择。

附:避免裸露的拥有指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2017-06-13
    • 2016-02-04
    • 2012-03-19
    • 1970-01-01
    • 2017-05-02
    • 2018-06-20
    相关资源
    最近更新 更多