创建没有字符串库的字符串类
Posted
技术标签:
【中文标题】创建没有字符串库的字符串类【英文标题】:Create string class without strings library 【发布时间】:2013-06-24 02:42:52 【问题描述】:我正在尝试在不使用字符串库的情况下创建自己的字符串类,即。 #include <string>
我可以使用 c 风格的字符串!
我必须制作iString
ctor,复制 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;
【问题讨论】:
因为我最近看到这个拼写错误很多,包括在你的问题中:bear vs bare with me C++ compiler warning - returning local variable的可能重复 触摸,@jogojapan。无论如何,我只是修复了错误;) 【参考方案1】:您不应返回来自operator+( , )
的引用
iString operator+(const iString &s1, const iString &s2)
...
【讨论】:
【参考方案2】:问题是s3在返回之后就已经被销毁了,所以当调用者最终拿到字符串时,会是一个已经被销毁的字符串的引用,因此是无效的。
IE:您正在返回对函数本地字符串的引用 - 当您到达调用者时,它将不再存在。
你需要的是按值返回。这样,字符串在返回时仍然有效。使用 C++11,这被认为是高效的,因为只要您提供移动构造和赋值,右值引用就可以。此外,在 C++98 中,您可以依靠许多编译器在许多情况下应用返回值优化来提高效率。
【讨论】:
我也可以这样做:iString &iString::&operator+(const iString &s1, const char *c_str)【参考方案3】:警告表明您正在返回对作为局部变量的对象的引用。这是一个问题,因为局部变量在函数返回时被破坏。
std::string
的operator+
返回一个新的字符串对象,而不是对字符串对象的引用;你可能也应该这样做。替代方法是创建一个新对象并返回一个指针,或者修改传递给运算符的字符串之一,看起来都不是很好。
【讨论】:
以上是关于创建没有字符串库的字符串类的主要内容,如果未能解决你的问题,请参考以下文章