2013-09-23 118 views
-6

我正在使用操作系统。但是,我不得不为开发人员创建“字符串”类型。 我试过typedefs和枚举,但他们都不符合我的需要。我想让类型字符串像Windows的VB.Net一样工作。 像这样:C++使用类定义新类型

string a 
a = "Hello, " 
a.CombineString ("World") 
int a = a.NumberOfChars() 

,所以我想出了这个(在C++)

class string { 
    char * value = NULL; //My Operating System's Kernel's Printf Function Uses Char Pointers 
    bool CompareString (char *); 
    int NumberOfChars() {return (!value);} 
    void CombineString (char *); 
} 

bool string::CompareString(char * string_to_compare_with) { 
    int return_prototype = 0; 
    return_prototype = strcmp(string::value, string_to_compare_with); //The strcmp() function returns 0 if the char*s are the same and 1 if different. 
    if(return_prototype == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

void string::CombineString(char * string_to_add) { 
    value = strcpy(value, string_to_add); 
} 

int main() { 
    string a; 
    a.value = "Hello, "; 
    a.CombineString("World!!"); 
    Printf(a); 
} 

这将打印字符串 “你好,世界!”在我的操作系统的控制台屏幕上。 我想只是去

string a = "Hello, "; 

string a; 
a.value = "Hello, "; 

我应该怎么办?

+13

我的意思是没有坏处的,但如果你正在写一个操作系统不应该字符串处理是一样,一个没有脑子? –

+1

为什么不使用'std :: string':http://www.cplusplus.com/reference/string/string/? –

+0

任何人都可以删除这个问题吗?我甚至不知道我是如何写出如此糟糕的问题的。谢谢 – Arcrascent

回答

4

定义一个构造函数,它需要一个const char*作为参数和一个复制构造函数应该这样做。在那里有一个拷贝构造函数也意味着你需要一个拷贝赋值操作符和一个析构函数。你还应该决定你的对象是否拥有字符串的所有权。在你的例子中 - a.value = "Hello, "; - 只是让该成员指向该字符串文字。之后你将无法修改 - 也许会在那里复制一份?

但是,我必须指出存在于<string>中的现有std::string实现。

+0

这是一个操作系统,而不是应用程序。仅从头开始编写的标准库就是13,486行。此外,我是一名学生......(惊喜) – Arcrascent

+2

@Arcrascent:'std :: string'由C++标准定义,并且与Windows无关。 –

3

我是个简单的研究员。我正在开发一个名为“Windows”的操作系统。它运行在自己的文件系统NTFS文件系统上,并支持用户模式,应用程序执行,内存管理以及其他很棒的东西。

除了有一个拷贝构造函数,你还需要赋值运算符重载:

const string& operator=(const string& arg){ 
    delete[] value; 
    value = new char[arg.NumberOfChars()+1]; 
    CombineString(const_cast<char*>(arg)); 
    return reinterpret_cast<string&>(*this); 
} 

string(const string& arg):value(NULL){ 
    value = new char[arg.NumberOfChars()+1]; 
    CombineString(arg); 
    return reinterpret_cast<string&>(*this); 
} 
+1

额外风格的+1 – sehe

+0

为了记录,在我刚刚编辑它之前,温和的snark提供了这个答案,是在对这个问题的不必要介绍之后建立的。所以不要惩罚这个简单的人。除非你想,否则就是我的客人! –