C ++ plus运算符不使用const char和其他

时间:2017-06-13 16:32:33

标签: c++ string

你好我做了一个像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之后等待我得到错误(调试(关闭程序))!

4 个答案:

答案 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* + stroperator+ 没有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 *和第二个参数的strconst 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);