我可以在 C++ 中为整个类赋值吗?

时间:2021-05-04 12:14:46

标签: c++ string

我正在用 C++ 编写自己的操作系统,但问题是常规的 string.h 文件无法正常工作,因此我需要创建自己的字符串类(无论如何我都想做 - { {1}} 工作与否),但我无法弄清楚如何编写它,因此我可以通过以下方式使用它:

string.h

甚至

string a = "Hello";
int i = a.length();

目前我的 string.h 看起来像这样:

int i = a.length;

但使用该实现时,必须像这样使用:

typedef char *string;
class String {     //same name of typedef and class means compilation error
    char *value;
    int length(string value);

如果这是此类“理论”问题的错误网站,我很抱歉,但如果是这种情况,请引导我到另一个更适合此问题的地方。

2 个答案:

答案 0 :(得分:1)

大多数时候我们使用标准库字符串实现。这可以包含在以下行中:

#include <string> 

然后以下列方式使用它:

std::string who = "me"; 
int len = who.size();

但既然你在学习,你似乎对实现自己的字符串实现充满热情。这是一个非常好的做法。于是赶紧抓了个头文件在线实现字符串:

mystring.h

class mystring
{
    char *pcString; // pointer to a char array
    int iCapacity; // capacity; strings grow
public: // note the public here
    // some constructors
    mystring(void);
    mystring(int);
    mystring(const char*);
    mystring(const string&);
    // some ops
    mystring& string::operator=(const string &strInstance);
    mystring& string::operator+(const string &strInstance);
    // your custom length
    int length() const; 
};

额外:代码审查堆栈交换stdstring-implementation

答案 1 :(得分:0)

<块引用>
string a = "Hello";

这在 C++11 及更高版本中不起作用,因为您已将 string 声明为非常量 typedef 指针的 char*,但字符串文字 {{1 }} 是一个 "Hello",它衰减成为一个 const char[6] 指针。您不能将 const char* 分配给非常量 const char*

但是,在 C++11 之前,您可以将字符串文字分配给非常量 char* 指针,但不鼓励这种做法,因为它增加了修改只读数据的可能性。这就是 C++11 及更高版本不再允许使用的原因。

您可能打算改用您的 char* 类:

String

但这也行不通,因为您的 String a = "Hello"; 类缺少接受 String 作为输入的构造函数。

<块引用>
const char*

这些都不起作用,因为 int i = a.length(); int i = a.length; 被声明为 a 指针,因此它没有方法或数据成员。但是,即使您使用了 char* 类,String 仍然无法工作,因为 a.length() 是隐式 length() 并且它需要一个 private 作为输入,你没有传入。

<块引用>
char*

他们没有相同的名字。 C++ 区分大小写,因此 typedef char *string; class String { //same name of typedef and class means compilation error string 是不同的名称。

<块引用>

但使用该实现时,必须像这样使用:

String

错了。如果正确实施,它可以像这样使用:

String a = new String;
a.value = "Hello World";

为了让它起作用,您的 String a = "Hello World"; 类需要看起来更像这样:

String

然后你可以像这样实现它:

class String {
private:
    char *value;

public:
    String(const char* str);
    ~String();
    int length() const;
};

现在这将按预期工作:

#include <cstring>

String::String(const char* str)
    : value(NULL)
{
    if (str) {
        value = new char[std::strlen(str) + 1];
        std::strcpy(value, str);
    }
}

String::~String()
{
    delete[] value;
}

int String::length() const
{
    return (value) ? std::strlen(value) : 0;
}

Demo

显然,这只是一个例子,有更好的方法来实现。就像在数据成员中缓存长度值一样。并根据 Rule of 3/5/0 实现复制构造函数和复制赋值运算符,以及移动构造函数和移动赋值运算符。

话虽如此,C++ 已经有一个标准的 std::string 类可以为您处理所有这些细节。实现自定义 String a = "Hello"; int i = a.length(); 类可以作为学习如何实现类的练习,但在实际生产代码中,请改用 String,例如:

std::string