你好我做了一个像string
这样的变量存储,这是源
class str
{
private:
const char * _mystring;
public:
// Using this function to made new str
str(const char * _str) { _mystring = _str; }
// Get the content of this str
const char * read() { return _mystring; }
// Get the content in char *
char * read_c() { return strdup(_mystring); }
// Operator for equal action with extern const char
str & operator = (const char * _str) { _mystring = _str; return *this; }
// Operator for equal action with extern str storage
str & operator = (str _str) { _mystring = _str.read(); return *this; }
// Operator for add action
str operator + (const char * _str) {
return str(strcat(read_c(), _str));
}
// Operator for add action with new str
str operator + (str & _str) {
return str(strcat(read_c(), _str.read()));
}
};
这是我的测试程序
int main() {
str var1("Var1"); // No problem
str var2("Var2"); // No problem
str var3 = var1 + var2; // No problem
str var4 = var1 + "tempStr"; // I got runtime error !
str var5 = "tempStr" + var2; // I got error before compile
cout << var1.read() << endl;
cout << var2.read() << endl;
cout << var3.read() << endl;
cout << var4.read() << endl;
return 0;
}
我可以创建类似var3和var4的问题是什么问题,我得到了错误(我得错误,而我想将const char与我的str合并...我设置+运算符但是有问题当我想将const char与我的str合并时(不是我的str与const char ...在这个动作上,没有问题) 但是在编译和打印var7之后等待我得到错误(调试(关闭程序))!
答案 0 :(得分:3)
str var3 = "tempTxt0" + "tempTxt1" + "tempTxt2"; // Error
str var4 = "tempTxt3" + var1; // Error
在这些行中,您尝试将2个指针添加到某个静态内存中(换句话说,您的操作符未被调用)
在运营商的左侧加上需要成为您的班级
在您的课程中使用空(只有\0
)实例会修复您的错误(正如您可能已经注意到的那样):
str var4 = str("") + "tempTxt3" + var1; //now it is okay
另请注意strcat
没有为连接分配内存,您必须自己realloc
答案 1 :(得分:3)
适用于str var3 = "tempTxt0" + "tempTxt1" + "tempTxt2"; // Error
:
这不起作用,因为编译器会看到这些类型(省略变量名称):str = const char* + const char* + const char *
。将char指针添加到一起并不是你想要的。但是,如果您只有其中一个类型为class str
,那么它会起作用。例如。 str = str(const char*) + const char* + const char *
会调用str::operator+
,它会返回str
类型的新对象,其余的将按照相同的方式进行。
适用于str var4 = "tempTxt3" + var1; // Error
:
这不起作用,因为您将operator+
声明为成员函数。编译器再次看到这些类型(省略变量名称):str = const char* + str
。 operator+
没有const char*
声明作为第一个操作数,str
作为第二个操作数。您有一名成员operator+
,但该操作符适用于class str
,因此左侧需要class str
;与str + const char*
中一样。可以把它想象成一个函数调用,因为它只是一个成员函数调用。这与键入str = str.operator+("text")
相同。现在你看,str = "text".operator+(str)
不起作用,因为它不存在。
如果您声明了非成员函数str operator+(const char* first, const str& second);
,那么它将起作用。编译器将查找与参数的外部命名空间范围匹配的运算符,直到全局范围(称为ADL)。但有更好的方法:
声明str operator+(const str& lhs, const str& rhs);
。如果以class str
的命名空间范围中的声明操作符,则编译器将使用第二个参数的类型(class str
使用ADL(on Wikipedia) })并找到此运算符。然后,编译器可以看到class str
具有可以采用const char*
:str(const char * str)
的非显式构造函数。然后,它可以创建class str
的临时对象,并使用您定义的operator+
。
因此,对于您的示例,由于您没有任何名称空间,因此您最简单地需要这个(请注意我添加了一些const
个关键字):
class str
{
private:
const char * _mystring;
public:
// Using this function to made new str
str(const char * _str) { _mystring = _str; }
// Get the content of this str
const char * read() const { return _mystring; }
// Get the content in char *
char * read_c() const { return strdup(_mystring); }
// Operator for equal action with extern const char
str & operator = (const char * _str) { _mystring = _str; return *this; }
// Operator for equal action with extern str storage
str & operator = (str _str) { _mystring = _str.read(); return *this; }
};
// Operator for add action with new str
str operator+ (const str& lhs, const str& rhs) {
return str(strcat(lhs.read_c(), rhs.read()));
}
P.S。
你的例子有更多问题。 read_c
复制10个字节的字符串(比如说),并在结尾处连接更多字节。这是一个溢出,因为您的重复缓冲区是10个字节。你必须正确地分配和释放内存,但那是我想的另一个问题。 E.g。
str operator+(const str& lhs, const str& rhs) {
const std::size_t ls = lhs.size();
const std::size_t rs = rhs.size();
char* n = new char[ls + rs + 1];
std::memcpy(n, lhs.read(), ls);
std::memcpy(n + ls, rhs.read(), rs);
n[ls + rs] = '\0';
return str(n);
}
然后你仍然有问题何时到delete
。
答案 2 :(得分:1)
当覆盖二进制运算符(如+
)时,左操作数必须是有问题的对象。你得到错误的原因是左操作数是一个字符串常量,这是默认的+
。
您需要为这些运算符创建好友函数,这些运算符接受第一个参数的const char *
和第二个参数的str
或const char *
。
答案 3 :(得分:0)
str var4 = var1 +&#34; tempStr&#34 ;; //我遇到了运行时错误!
在这种情况下,调用operator + overload:
str operator + (const char * _str) {
return str(strcat(read_c(), _str));
}
你在一个指针上调用strcat
,该指针指向一个不足以包含当前字符串和_str的缓冲区。最快的解决方案是使用std::string
,否则你需要分配足够大的缓冲区并记住要保持其生命周期(遵守三条规则等)。
str var5 =&#34; tempStr&#34; + var2; //我在编译之前遇到错误
您需要以下签名的全局运算符重载:
str operator + (const char * _str, const str& s);