首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载operator+ / char* ch1 + char* ch2

重载operator+ / char* ch1 + char* ch2
EN

Stack Overflow用户
提问于 2011-04-03 22:54:16
回答 3查看 3.6K关注 0票数 3

我创建了带有一些额外函数的简单字符串类--它主要用于学习目的。现在我想要重载操作符+,允许我在字符串中添加两个或多个char*。

这就是我想做的:

代码语言:javascript
复制
tom::string TXT;
TXT="abcde" + "1234";
cout << TXT << endl;

产出必须是:

abcde1234

我想添加的不仅仅是const char*后面的内容如下:

代码语言:javascript
复制
..
int NUM=34;
TXT="abcd"+NUM+"098";
cout << TXT << endl;

产出必须是:

abcd34098

我已经对操作符<<做了类似的事情

代码语言:javascript
复制
TXT << "abcd" << ".......";

但我需要和+接线员联系。另一件事是(可能会用+操作符排序)。

代码语言:javascript
复制
void testF(tom::string INP) {
 cout << INP << endl;
}

int NUM=123;
testF("abcd"+NUM+"efg");

产出:

abcd123efg

如果我还在尝试以错误结尾的东西:

错误:类型‘const 4’和‘const 3’到二进制‘operator+’的操作数无效

下面是tom::string类的一部分:

代码语言:javascript
复制
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;
            }
// .....
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-03 22:55:58

代码语言:javascript
复制
tom::string TXT;
TXT="abcde" + "1234";
cout << TXT << endl;

首先对"abcde" + "1234"进行评估--您不能让它按您的要求工作。

例如,你可以让它发挥作用:

代码语言:javascript
复制
tom::string TXT;
TXT=tom::string("abcde") + 987 + "1234";
cout << TXT << endl;

这将需要一个operator+(int)和一个operator+(char const *)

编辑:示例操作符:

operator+应该返回一个新的对象,而不是修改被调用的对象。

代码语言:javascript
复制
class string {
  ...
  friend string operator+(string const & LHS, char const * RHS) {
    string s = LHS;
    s._add(RHS);
    return s;
  }
};
票数 2
EN

Stack Overflow用户

发布于 2011-04-03 22:55:49

不能只为指针类型重载运算符。所涉及的至少一种类型需要是用户定义的类型。

票数 4
EN

Stack Overflow用户

发布于 2011-04-03 23:49:24

谢谢埃里克!分类(工作)

我在tom::string类中添加了:

代码语言:javascript
复制
friend string operator+(string const & LHS, char const * RHS) {
    string s;
    s=LHS;
    s._add(RHS);
    return s;
}

下一个抛出malloc错误-我必须检查它,但第一个工作完美!

代码语言:javascript
复制
friend string operator+(string const & LHS, char const * RHS) {
    string s=LHS;
    s._add(RHS);
    return s;
}

以及测试:

代码语言:javascript
复制
void test2 (tom::string ooo) {
    cout << ooo << endl;
}

test2(tom::string("abcde")+"AA"+"BB");

显示:

abcdeAABB

再来一次!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5533085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档