8

私はC++を初めて使用し、学習しています。私はかなりの量のJavaといくつかのCを知っています。

私がやりたいのは、文字列値を取り込んでその文字列をクラスフィールドにコピーし、最終的に文字列よりもはるかに効率的に解析できるIDにハッシュする不変の名前クラスを作成することです。

C ++文字列に関する一般的な知識が不足しているため、壁にぶつかっています。これが私がこれまでに持っているものです...

#pragma once

#include <string>

class Name
{
public:
    Name(std::string s);
    ~Name(void);

    int getId();
    std::string getName();

private:
    int id;
    std::string name;
};

と...

#include "Name.h"

Name::Name(std::string s)
{

}

したがって、私がやりたいのは、コンストラクターによって渡されたsの値を「name」プライベートフィールドに格納することです。私の知る限り、新しい文字列オブジェクトを作成してから、sの値をそのオブジェクトにコピーする必要があります。

また、引数sは、文字列オブジェクトではなく文字列ポインタである可能性があり、またそうあるべきだと思います(不要なコピーが発生しないようにするため)。私が正しければ、コンストラクターは次のようになりますよね?

Name::Name(std::string &s) { ... }

この場合、名前を渡すときに特別なことをする必要はありませんか?IE。

Name n = new Name("Cody");

完全に有効ですか?実は、私の知る限り「コーディ」は一定の文字列かそのようなものなので、よくわかりません。

それで、私がすべて正しい軌道に乗っている場合、実際に値をコピーする適切な方法は何ですか?これは適切だと思いますが、よくわかりません。

#include "Name.h"

Name::Name(std::string s)
{
    name = new string(s);
}

事前に助けてくれてありがとう、それが基本的な質問であることは知っていますが、私はゆっくりとC++の世界に足を踏み入れています。:)-コーディ

4

2 に答える 2

3

あなたは近くにいます、あなたのコードは少しマッサージした後このようになることができます:

class Name
{
public:
    Name(const std::string& s);  // add const and reference
    ~Name(void);

    int getId() cosnt;           // add const
    std::string getName() const; // add const

private:
    int id;
    std::string name;
};

Name.cpp

Name::Name(const std::string& s):name(s)
{
}

:name(s)これはと呼ばれますmember initializer list

名前n=new Name( "Cody"); 完全に有効ですか?実は、私の知る限り「コーディ」は一定の文字列かそのようなものなので、よくわかりません。

いいえ、nポインタではありません。すべてのオブジェクトに対して新しく作成する必要のあるJavaとは異なります。C ++では、

Name n("Cody");

これによりName(const std::string& s)、オブジェクトnが初期化され、名前文字列が「Cody」で初期化されます。注:変数nには自動保存期間があり、スコープ外になると破棄されます。

動的nな保存期間を有効にするには、新規/削除のペアを使用する必要があります。

 Name *pn = new Name("Cody");
 delete pn;

delete n_ptr;または、スマートポインターを使用する場合は、スコープ外になるとn_ptrも破棄されるため、呼び出す必要はありません。

 #include <memory>
 std::shared_ptr<Name> n_ptr(new Name("Cody"));

編集:

他のクラスでNameクラスを使用するには、Nameクラスで文字列を使用する場合と同じ方法で、ポインタを使用する必要はありません。

class TestName
{
public:
   TestName(const Name& n):name_(n){ }

private:
  Name name_;
};

TestName tn("Cody");
于 2012-12-23T03:25:38.120 に答える
1

ここへの定数参照を使用する必要がありstd::stringます。

あなたが言ったように、それは不必要なコピーを防ぐでしょう..しかし、なぜただのポインタや定数ポインタではないのですか?

定数参照を使用すると、暗黙的にrightを呼び出すいくつかの引数を関数に渡すことができますstd::string constructor

つまり、一言で言えば、あなたはそれを行うことができます:

Name::Name(const std::string& s)
{
    this->name = s;
}

// Or even better..
Name::Name(const std::string& s):
    name(s)
{
}

int    main(void)
{
    Name    nick("hello");

    return 0;
}

あなたはstd::string's constructorsそのcplusplus.comのシートですべてについて知ることができます。

于 2012-12-23T03:18:17.793 に答える