質問

コンストラクタが文字列へのconst参照をとるクラスがあります。この文字列はオブジェクトの名前として機能するため、クラスのインスタンスの存続期間を通して必要です。

このクラスの使用方法を想像してください:

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    std::string name;
};

myclass* proc() {
    std::string str("hello");
    myclass* instance = new myclass(str);
    //...
    return instance;
}

int main() {
    myclass* inst = proc();
    //...
    delete inst;
    return 0;
}

proc()の文字列はスタック上に作成されるため、proc()の終了時に削除されるため、 クラスインスタンス内でそれを参照するとどうなりますか?私の推測では無効になります。クラス内にコピーを保持する方が良いでしょうか?文字列のような潜在的に大きなオブジェクトの不必要なコピーを避けたいだけです...

役に立ちましたか?

解決

はい、あなたの場合、参照は無効になります。文字列を使用しているため、 myclass クラスに文字列オブジェクトのコピーを保持することをお勧めします。

他のヒント

必ず:コピー。 " std :: string name"を持つクラスのメンバー。ライフタイムを制御する唯一の方法です。

myclass :: _ nameが参照でない場合、コピーされ、無効になりません。

コピーする必要はありません。 myclass std :: string name (参照ではない)メンバーを宣言します(何らかの形で完全に省略します)。 const char * を引数として渡します。このようにして、コピーせずにクラス内で名前オブジェクトを直接構築します。

class myclass {
public:
    std::string name;
    myclass(const char *_name) : name(_name) { }
};

myclass *proc() {
    return new myclass("hello");
}

はい、std :: stringは消えますが、c str" hello"定数ではありません。

2つの可能な答えがあります。 c strを参照として使用するか、std:stringを静的にします。

フィールドmyclass :: nameは、std :: string型でなければなりません。 C ++の文字列は書き込み時にコピーされます( http://en.wikipedia.org/ wiki / Copy-on-write )を使用すると、大きなオブジェクトのコピーで問題が発生しません。

MyClassに文字列のコピーを保持します。参照を保持することは決定的に安全ではありません 。多くのインスタンスが同じ名前を持つと予想される場合は、 Flyweightデザインパターン同等のインスタンスが多数ある場合にストレージを節約できます。 Boost.Flyweight は非常に便利な実装です次のように書くことができるこのパターンの:

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    boost::flyweight<std::string> name;
};

std :: stringの一部の実装では、これをバックグラウンドで実行できますが、必須ではありません。そのため、これに依存しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top