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