-6

私は現在、オペレーティングシステムに取り組んでいます。ただし、開発者向けに「String」型を作成する必要がありました。typedef と列挙を試してみましたが、それらはすべて私のニーズに合いませんでした。タイプ文字列を Windows の VB.Net のように機能させたいと考えました。このような:

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

これは文字列 "Hello, World!!" を出力します。私のオペレーティングシステムのコンソール画面で。でも行きたいだけ

string a = "Hello, ";

いいえ

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

私は何をすべきか?

4

2 に答える 2

4

const char*as パラメーターを受け取るコンストラクターとコピー コンストラクターを定義することで、それを行う必要があります。そこにコピー コンストラクターがあるということは、コピー代入演算子とデストラクタが必要になることも意味します。また、オブジェクトが文字列の所有権を引き継ぐかどうかも決定する必要があります。あなたの例では - a.value = "Hello, ";- そのメンバーがその文字列リテラルを指すようにするだけです。後で変更することはできません - おそらくそこにコピーを作成しますか?

ただし、 にstd::string存在する既存の実装を指摘する必要があり<string>ます。

于 2013-09-23T20:16:28.633 に答える
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);
 }
于 2013-09-23T20:54:01.330 に答える