【发布时间】:2011-04-03 22:54:16
【问题描述】:
我创建了带有一些额外功能的简单字符串类 - 主要用于学习目的。 现在我想重载运算符 + 以允许我在字符串中添加两个或多个 char*。
这就是我想做的:
tom::string TXT;
TXT="abcde" + "1234";
cout << TXT << endl;
输出必须是:
abcde1234
我想稍后添加的不仅仅是 const char*:
..
int NUM=34;
TXT="abcd"+NUM+"098";
cout << TXT << endl;
输出必须是:
abcd34098
我已经用运算符 做过类似的事情
TXT << "abcd" << ".......";
但我需要它与 + 运算符。 另一件事是(可能会用 + 运算符排序)
void testF(tom::string INP) {
cout << INP << endl;
}
int NUM=123;
testF("abcd"+NUM+"efg");
带输出:
abcd123efg
如果我正在尝试任何仍然以错误结尾的东西:
错误:类型的无效操作数 ‘const char [4]’和‘const char [3]’ 到二进制'operator+'
这里是 tom::string 类的一部分:
namespace tom {
class string {
private:
unsigned int _length;
unsigned int _search_pos;
bool _changed;
bool _indexed;
char* _buffer;
unsigned int* _indexes;
unsigned int _indexCount;
char* _emptyChar;
unsigned int _null;
char* _retBuffer[RET_BUFFERS];
short unsigned int _retBufferIndex;
// ADD to string
void _add (const char* txt) {
_buffer=(char*) realloc(_buffer, sizeof(char)*(_length+strlen(txt)+1));
memcpy(&_buffer[_length], txt, strlen(txt));
_length=_length+strlen(txt);
_buffer[_length]=static_cast<char>(0);
_changed=true;
free(_indexes);
_changed=true;
_indexCount=0;
_indexed=false;
_indexes = (unsigned int*) malloc (sizeof(unsigned int)*2);
}
// .......
// REPLACE Whole string
string& _rvs(const char* txt) {
free(_buffer);
free(_indexes);
_changed=true;
_indexCount=0;
_indexed=false;
_indexes = (unsigned int*) malloc (sizeof(unsigned int)*2);
_length=strlen(txt);
_buffer = (char*) malloc (sizeof(char)*(_length+1));
memcpy(_buffer, txt, _length);
_buffer[_length]=static_cast<char>(0);
return (*this);
}
// .......
public:
// ----------------------------------------------
// | CONSTRUCTOR |
// ----------------------------------------------
string(const char* _init="") {
_length=0;
_indexCount=0;
_changed=false;
_indexed=false;
_buffer = (char*) malloc (sizeof(char)*(strlen(_init)+1));
memcpy(_buffer, _init, strlen(_init));
_indexes = (unsigned int*) malloc (sizeof(unsigned int)*2);
_emptyChar = (char*) malloc (sizeof(char));
_buffer[strlen(_init)]=static_cast<char>(0);
_emptyChar[0]=static_cast<char>(0);
_null=(unsigned int)-1;
_retBufferIndex=0;
for (short unsigned int ii=0; ii<RET_BUFFERS; ii++) {
_retBuffer[ii] = (char*) malloc (sizeof(char));
_retBuffer[ii][0]=static_cast<char>(0);
}
}
string(const tom::string& _init) {
string((const char*)_init.c_str());
}
// ----------------------------------------------
// | DESTRUCTOR |
// ----------------------------------------------
~string() {
free(_buffer);
free(_indexes);
free(_emptyChar);
for (short unsigned int ii=0; ii<RET_BUFFERS; ii++) {
free(_retBuffer[ii]);
}
}
// .....
string& operator = (string &ttxt) {
const char* txt=ttxt.c_str();
return (_rvs(txt));
}
string& operator = (const char* txt) {
return (_rvs(txt));
}
string& operator = (int num) {
char bf[32];
sprintf (bf, "%d", num);
const char* txt=bf;
return (_rvs(txt));
}
string& operator << (const char* txt) {
_add(txt);
return(*this);
}
string& operator << (int num) {
char bf[32];
sprintf (bf, "%d", num);
const char* txt=bf;
_add(txt);
return(*this);
}
operator const char*() {
return (const char*)_buffer;
}
// .....
}
}
【问题讨论】:
-
我会改掉前缀标识符带下划线的习惯。你可能不知道相关的规则(到目前为止没有被破坏)。如果您必须为成员变量添加前缀,请使用 'm_'
-
郑重声明,关于字符串类型是否应该定义
+运算符,文献中存在分歧。一方面,这似乎是一件显而易见的事情。另一方面,-运算符没有意义。一元+和-也不行。*仅在一个操作数为正整数时才有意义。等等…… -
您的类包含 RAW 拥有的指针。我没有看到应用 3 的规则!面对你的复制构造函数完全坏了。
-
@Martin:说实话我不知道你在说什么 ;-( ...我是 C++ 的新手,我只是从示例中学习
-
@Mike:我知道有连接字符串的功能,但它更容易并且(对我而言)看起来更好,例如 debug("Variable 1:"+NUM+", indexed: "+ _索引);喜欢用 printf 或