Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的C风格字符串实现+; 我正在试用C++中的C风格字符串实现。 我为类字符串创建了一个对象和一个指针,并将该对象分配给指针。当我试图通过指针修改对象而不是修改现有对象时,我想创建一个新对象并使指针指向它_C++_Operator Overloading_This - Fatal编程技术网

C+中的C风格字符串实现+; 我正在试用C++中的C风格字符串实现。 我为类字符串创建了一个对象和一个指针,并将该对象分配给指针。当我试图通过指针修改对象而不是修改现有对象时,我想创建一个新对象并使指针指向它

C+中的C风格字符串实现+; 我正在试用C++中的C风格字符串实现。 我为类字符串创建了一个对象和一个指针,并将该对象分配给指针。当我试图通过指针修改对象而不是修改现有对象时,我想创建一个新对象并使指针指向它,c++,operator-overloading,this,C++,Operator Overloading,This,因此,我重载了“=”操作符,并在操作符重载方法中创建了一个新对象。为了反映变化,我需要使用ss=*ss=“name” 任何改进此代码的建议 下面是我的示例代码 class String { char *str; public: String(char* str_in) { str = new char[strlen(str_in)]; strcpy(str, str_in); } String* operator=(char

因此,我重载了“=”操作符,并在操作符重载方法中创建了一个新对象。为了反映变化,我需要使用
ss=*ss=“name”

任何改进此代码的建议

下面是我的示例代码

class String
{
    char *str;
public:
    String(char* str_in)
    {
        str = new char[strlen(str_in)];
        strcpy(str, str_in);
    }
    String* operator=(char* s)
    {
        return new String(s);
    }
};
int main()
{
    String s="sample";
    String *ss;
    ss = &s;
    ss=*ss = "name";
    return 0;
}
我还试图修改this指针,但没有按预期工作

String *ptr;
ptr = const_cast<String*>(this);
ptr = new String(s);
String*ptr;
ptr=常数(本);
ptr=新字符串;

我建议进行如下更改:

#include <string.h>

class String
{
    char *str;
public:
    String(const char* str_in)
    {
        str = new char[strlen(str_in)];
        strcpy(str, str_in);
    }

    ~String()
    {
        delete [] str;
    }

    String& operator=(const char* s)
    {
        char* tmp = new char[strlen(s)];
        strcpy(tmp, s);
        delete [] str;
        str = tmp;
        return *this;
    }
};
int main()
{
    String s("sample");
    String *ss;
    ss = &s;
    ss = new String("name");
    delete ss;
    return 0;
}
#包括
类字符串
{
char*str;
公众:
字符串(常量字符*str_in)
{
str=新字符[strlen(str_in)];
strcpy(str,stru-in);
}
~String()
{
删除[]str;
}
字符串和运算符=(常量字符*s)
{
char*tmp=新字符[strlen];
strcpy(tmp,s);
删除[]str;
str=tmp;
归还*这个;
}
};
int main()
{
字符串s(“样本”);
字符串*ss;
ss=&s;
ss=新字符串(“名称”);
删除ss;
返回0;
}
首先,您需要一个合适的析构函数,否则当字符串被销毁时,您将出现内存泄漏。删除char*可以解决这个问题(因为它是一个数组,所以我们使用数组删除)

第二,在C++中,我们几乎总是返回操作符=(不是指针)的引用。所以这个修改后的operator=函数可能更好——它删除旧字符串,为新字符串分配内存,复制新字符串,并返回*this

第三,您可以对构造函数和赋值运算符使用const char*而不是char*,因为您没有编辑它

在main()中,我还为指向的指针创建了一个新对象,因为您在原始帖子中请求了该对象(随后将其删除以避免内存泄漏)


如果您对这些更改有任何疑问,请告诉我。

这是一种练习吗?
std::string
在您的情况下不可用吗?是的,这只是一个练习。
ss=*ss=“name”不编译。它编译并按预期工作。在运算符=,可能建议将new&strcopy放入临时变量,然后删除&replace str。这样,如果new抛出异常,对象将保持不变。这一点很好。我刚刚编辑了它。如果你觉得好看就告诉我。看起来好多了。如能就muh的原始评论进行投票,将不胜感激。谢谢!