我正在用 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);
如果这是此类“理论”问题的错误网站,我很抱歉,但如果是这种情况,请引导我到另一个更适合此问题的地方。
答案 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;
}
显然,这只是一个例子,有更好的方法来实现。就像在数据成员中缓存长度值一样。并根据 Rule of 3/5/0 实现复制构造函数和复制赋值运算符,以及移动构造函数和移动赋值运算符。
话虽如此,C++ 已经有一个标准的 std::string
类可以为您处理所有这些细节。实现自定义 String a = "Hello";
int i = a.length();
类可以作为学习如何实现类的练习,但在实际生产代码中,请改用 String
,例如:
std::string