我正在用c ++编写我自己的字符串类StringEx
(不用担心,只是为了练习)但是我没有通过为它指定一个字符串来创建我的类的实例:
StringEx string1 = StringEx("test"); // works fine
StringEx string2 = "test"; // doesn't work
string string3 = "test";
string1 = string3; // also works fine
我重载了赋值运算符,因此它可以处理std::string
,但我必须首先创建一个StringEx
的对象。
如何通过为其指定字符串来创建StringEx
的新对象?甚至可以将每个"string"
的c ++处理作为StringEx
类的对象吗?
这是我的StringEx.h
,现在可以使用
#ifndef STRINGEX_H
#define STRINGEX_H
#include <iostream>
#include <string>
#include <vector>
using namespace std; //simplyfying for now
class StringEx
{
private:
vector<char> text;
public:
StringEx();
StringEx(string);
StringEx(const char*); // had to add this
StringEx(vector<char>);
int size() const;
int length() const;
char at(int) const;
void append(const string&);
void append(const StringEx&);
void append(const char*); // had to add this
StringEx operator+(const string&);
StringEx operator+(const StringEx&);
StringEx operator+(const char*); // had to add this too
StringEx operator=(const string&);
StringEx operator=(const StringEx&);
StringEx operator=(const char*); // had to add this too
StringEx operator+=(const string&);
StringEx operator+=(const StringEx&);
StringEx operator+=(const char*); // had to add this too
friend ostream& operator<<(ostream&, const StringEx&);
};
#endif // STRINGEX_H
答案 0 :(得分:5)
一些准确性:
StringEx string1 = StringEx("test"); // works fine
这使用了复制构造函数,即StringEx(const StringEx& other);
StringEx string2 = "test"; // doesn't work
这会尝试使用具有以下签名的构造函数:StringEx(const char* str);
最后,这两行:
string string3 = "test";
string1 = string3; // also works fine
从标准库定义的std::string
创建const char*
,然后使用您似乎已正确定义的std::string
重载的复制赋值运算符,即{{ 1}}。
这里的关键是这句话:
StringEx& operator=(const std::string& other)
不是一个分配,它是一个使用构造函数而不是复制赋值运算符的变量的声明和初始化。
在您的情况下,您只是错过了以Type myVar = something;
为参数的构造函数。
答案 1 :(得分:2)
TLDR:如果需要2次“强制转换”,编译器将不会自动解决。在这种情况下,const char*
到std::string
到StringEx
StringEx string1 = StringEx("test"); // works fine
&gt;这会显式调用构造函数,因此只能进行一次转换:const char*
到std::string
。
StringEx string2 = "test"; // doesn't work
&gt;另一方面,这一点尚不清楚。是否要将const char*
转换为std::string
并使用StringEx(const std::string&)
构造函数或使用其他中间类?
您需要的是另一个接受const char*
作为参数的构造函数。
BTW:
StringEx string4 = std::string("test"); //Also works
答案 2 :(得分:2)
我假设你有一个
形式的非显式构造函数StringEx (const std::string&);
或类似。
字符串文字不是std::string
类型。 "test"
的类型为const char[5]
。 std::string
有一个非显式构造函数接受const char*
,所以你的两个调用看起来像这样(不考虑复制省略):
//implicitly convert "test" to temporary std::string
//construct temporary StringEx with temporary std::string
//copy-construct StringEx with temporary
StringEx string1 = StringEx("test");
//no StringEx constructor taking const char*
//two conversions necessary to make "test" into a StringEx
//invalid
StringEx string2 = "test";
一个简单的解决方法是添加一个const char*
到StringEx
的构造函数:
StringEx (const char*);
或者你可以使用直接初始化:
//only one conversion needed
StringEx string2 ("test");