0

構築方法に応じて、異なる動作をするクラスを作成することを検討しています。

例:

// #1 - Own an object
class MyClass {
    MyClass(std::string const& str) : m_str(str) {}

    std::string m_str;
}

// #2 - Share an object (Can be done by pointer as well)
class MyClass {
    MyClass(std::string& str) : m_str(str) {}

    std::string& m_str;
}
  1. 同じクラスに両方の動作を持たせることは良い考えですか?
  2. そのようなクラスを実装する最良の方法は何ですか?
4

2 に答える 2

2

これを試して:

struct MyClass
{
    std::unique_ptr<std::string> dont_touch_me;
    std::string & str;

    explicit MyClass(std::string const & s)
    : dont_touch_me(new std::string(s))
    , str(*dont_touch_me)
    { }

    explicit MyClass(std::string & r)
    : str(r)
    { }
};

MyClass::strここで、常にすべてに使用するようにしてください。

于 2012-08-14T13:00:02.647 に答える
0
struct ReferenceHolder
{
private:
    std::string& m_str;
public:
    ReferenceHolder(std::string& str) : m_str(str) {}
    // ... all other methods operating on m_str
};

struct ValueHolder : public ReferenceHolder
{
private:
    std::string m_str;
public:
    ValueHolder(const std::string& str) : ReferenceHolder(m_str), m_str(str) {}
};

非 const 参照で構築されたオブジェクトは内部文字列を使用しないため、単一のクラスで両方の動作を組み合わせることは、実際には良い考えではありません。コンストラクターに const 参照または非 const 参照のどちらを渡すかを呼び出し側が決定できる場合、2 つのクラス名の間で決定するのは難しくありません。

ただし、両方と参照を保持するオーバーヘッドstd::stringはかなり小さいです。値によって内部に文字列を含むオブジェクトをシームレスに渡したい場合は、Kerrek SB が提案したようにそれを行う必要があります。

于 2012-08-14T13:13:50.063 に答える