【问题标题】:C# style string implementation in c++c++ 中的 C# 样式字符串实现
【发布时间】:2017-11-30 15:39:45
【问题描述】:

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

所以我重载了“=”运算符,并在运算符重载方法中创建了一个新对象。为了反映更改我需要使用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);

【问题讨论】:

  • 这是一种运动吗? std::string 在您的情况下不可用吗?
  • 是的,这只是一个练习。
  • ss=*ss = "name"; 无法编译。
  • 它按预期编译和工作

标签: c++ operator-overloading this


【解决方案1】:

我会推荐一些这样的改变:

#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;
}

首先,你需要一个合适的析构函数,否则当 String 被销毁时你会发生内存泄漏。删除 char* 可以解决这个问题(因为它是一个数组,所以我们使用数组删除)。

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

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

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

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

【讨论】:

  • 在 operator= 中,可能建议将 new & strcopy 到一个临时变量中,然后删除 & 替换 str。这样,如果 new 抛出异常,对象是不变的。
  • 好点。我刚刚编辑了它。如果您认为它看起来不错,请告诉我。
  • 看起来好多了。对 muh 原始评论的支持将不胜感激。谢谢!
猜你喜欢
  • 2011-01-15
  • 2015-01-13
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多