C ++:错误:类型'String *'和'const char [7]'到二进制'operator +'的操作数无效

时间:2009-08-22 22:44:52

标签: c++ string operator-overloading

我正在学习cpp,在我的上一个作业中,我正在重写std :: string类。 所以这是我的代码大纲: 字符串类:

   class String {
    public:
        String(const char* sInput) {
            string = const_cast<char*> (sInput);                
        }

        const String operator+(const char* str) {
            //snip
            print();
        }

        void print() {
            cout<<string;
        }

        int search(char* str) {

        }

    private:
        char* string;
        int len;
};

哦,我不得不说我试图将方法声明为String * operator +(const char * str)和const String&amp; operator +(const char * str)没有变化。 以下是我如何运行它:

int main(int argc, char* argv[]) {
    String* testing = new String("Hello, "); //works
    testing->print();//works
    /*String* a = */testing+"World!";//Error here.
return 0;
}

完整的错误是这样的:

  

foobar.cc:13:错误:操作数无效   类型'String *'和'const char   [7]'到二元'运算符+'

我抬头看谷歌,在我正在学习的书中没有成功。 有建议吗? (我很确定我正在做一些愚蠢的事情,你必须原谅我,我原本是一名PHP程序员)任何人都可以指出我错过了什么?

2 个答案:

答案 0 :(得分:5)

您可能不希望将指针用于String类。试试这段代码:

int main(int argc, char* argv[]) {
    String testing = String("Hello, "); //works
    testing.print();//works
    String a = testing+"World!";
    return 0;
}

为C ++类型定义新运算符时,通常会直接使用实际类型,而不是指向类型的指针。像上面那样分配的C ++对象(如String testing)在堆栈上分配(一直存在“范围”或函数结束)而不是堆(直到程序结束)。

如果你真的想使用指向你的类型的指针,你可以像这样修改最后一行:

String *a = new String(*testing + "World!");

但是,遵循std::string的示例,这通常不是您通常想要使用此类字符串类的方式。

答案 1 :(得分:3)

您的运营商+是为Stringconst* char定义的,而不是String*。在添加之前,您应该取消引用testing,即:

String a = (*testing) + "World";

虽然在这种情况下,我没有看到在第一步测试指针的重点。

编辑:创建没有指针的字符串将如下所示:

String testing = "Hello, ";

String testing("Hello, ");

(两者都相同)。