1

我正在尝试在不使用字符串库的情况下创建自己的字符串类,即。#include <string>

我可以使用 c 风格的字符串!

我必须制作iStringctor、复制 ctor、dtor 并重载运算符 >>、<<、+、*

到目前为止,我的问题是,当我尝试编译我的工作时,我的每个operator+operator*...都会出现此错误,即:

warning: reference to local variable s3 returned [enabled by default]

s3只是iString对象名称。

这是我到目前为止所拥有的:

.h 文件

#ifndef __ISTRING_H__
#define __ISTRING_H__

struct iString{
  char * chars;
  unsigned int length;
  unsigned int capacity;
  iString();  // ctor
  iString(const char *); // copy ctor
  iString(const iString&); // copy ctor
  ~iString(); // dtor
};

std::istream &operator>>(std::istream &in, const iString &s);
std::ostream &operator<<(std::ostream &out, const iString &s);
iString &operator+(const iString &s1, const iString &s2);
iString &operator+(const iString &s1, const char *c_str);
iString &operator*(const iString &s, const int k);
iString &operator*(const int k, const iString &s);


#endif

.cc 文件

#include <iostream>
#include "istring.h"
#include <cstring>

using namespace std;

iString::iString(){  // this is my ctor
  chars = new char[1];
  length = 0;
  capacity = length + 1;
  chars[0] = '\0';
}

iString::iString(const char *word){ // this is my copy ctor from a c-string
  length = strlen(word);
  capacity = length + 1;
  chars = new char[capacity];
  strcpy(chars, word);
}

iString::iString(const iString &s){ // this is my copy ctor from an iString
  length = strlen(s.length);
  capacity = length + 1;
  chars = new char[capacity];
  strcpy(chars, s.chars);
}


iString::~iString() { //dtor
  delete [] this->chars;
}

istream &operator>>(istream &in, const iString &s){  // not done, don't worry

}

ostream &operator<<(ostream &out, const iString &s){
  //out<<s.chars;
  return out<<s.chars;
}

iString &operator+(const iString &s1, const iString &s2){ 
  iString s3;

  char *new_str;// = new char[size];
  new_str = strcat(s1.chars, s2.chars);

  s3 = iString(new_str);
  return s3;
}

// tried a different approach 
iString &operator+(const iString &s1, const char *c_str){ 

  int size = s1.length + strlen(c_str) + 1;
  char *new_str = new char[size];

  strcpy(new_str, s1.chars);
  strcat(new_str, c_str); 

  iString s3(new_str);
  delete [] new_str;
  return s3;
}

iString &operator*(const iString &s, const int k){

  int size = (s.length * k) + 1;
  char *c_str = new char[size];
  for(int i = 0; i < k; i++){
    strcat(c_str, s.chars);
  }

  iString t(c_str);
  delete[] c_str;
  return t;
}

iString &operator*(const int k, const iString &s){
  return s * k;
}
4

3 回答 3

1

你不应该从operator+( , )

iString operator+(const iString &s1, const iString &s2){
 ...
}
于 2013-06-24T02:47:45.853 回答
1

问题是s3在返回之后就已经被破坏了,所以当调用者最终拿到字符串时,它会是一个已经被破坏的字符串的引用,因此是无效的。

IE:您正在返回对函数本地字符串的引用 - 当您到达调用者时,它将不再存在。

您需要的是按值返回。这样,字符串在返回时仍然有效。使用 C++11,这被认为是高效的,因为只要您提供移动构造和赋值,右值引用就可以。此外,在 C++98 中,您可以依靠许多编译器在许多情况下应用返回值优化来提高效率。

于 2013-06-24T02:51:22.963 回答
0

该警告表明您正在返回对作为局部变量的对象的引用。这是一个问题,因为局部变量在函数返回时被破坏。

std::string'soperator+返回一个新的字符串对象,而不是对字符串对象的引用;你可能也应该这样做。替代方法是创建一个新对象并返回一个指针,或者修改传递给运算符的字符串之一,看起来都不是很好。

于 2013-06-24T02:51:55.183 回答