0

私は C++ を学んでいますが、ちょっとした問題があります。を含むクラスがありますvector<int>。外部からこれvector<int>にアクセスできる必要があるため、その要素を追加/削除/取得できる必要があります。

オブジェクトを新しいインスタンスでオーバーライドすることはできません。これはそのようなクラスの例です(最小化されています):

class MyClass
{
    public:
        vector<int>& vec() { return _vec; }
    private:
        vector<int> _vec;
};

たとえば、次のコードは機能します。

MyClass x;
x.vec().push_back(0);
x.vec().push_back(7);
x.vec().push_back(9);
cout << c.vec().size() << endl;

残念ながら、次のコードも機能します。

MyClass x;
x.vec() = vector<int>();

私はこれを禁止したいのですが、 type のポインターを返す解決策しか見つかりませんでしたvector<int> *。しかし、ポインターは「悪」であり、直接使用するべきではなく、スマートポインターを使用する必要があることを学びました。この問題にはスマートポインターは役に立たないと思うので、この単純な問題を解決する方法がわかりません:-/

それとも、単純なポインターが最もクリーンなソリューションですか?

よろしくお願いします

ケビン

-編集-

一般的に、次の C# クラスのように使用できるものを作成するのが好きです。

public class MyClass
{
    public List<int> List { get; private set; }

    public MyClass()
    {
        List = new List<int>();
    }
}

これは単なる例であり、これを C++ で作成する方法を考えただけです。vector<int>たぶん、List<int>他のクラスに含めるよりもはるかに複雑なクラスがある場合があります。

しかし、内部オブジェクトに独自のメソッド (= インターフェイス) を定義することによってのみ、これを行うことができるかもしれません。

4

3 に答える 3

3

受け入れられる唯一の解決策は、ベクトル クラスの潜在的にすべてのメソッドに転送関数を提供することであるというのは、私には間違っているように思えます。そこで、別の答えを提案したいと思います。

プライベートにすることでメソッドvectorを非表示にする、パブリックに派生した小さなテンプレート クラスを作成します。operator=

template<class T>
class immutablevector : public vector<T>
{
  private:
    immutablevector &operator=(vector<T>);
};

次に、を使用するMyClass場合は、代わりvectorに を使用immutablevectorします。

class MyClass
{
  public:
    immutablevector<int>& vec() { return _vec; }
  private:
    immutablevector<int> _vec;
};

メソッドを介してすべてのベクター機能に安全にアクセスvecできるようになりましたが、新しいベクター インスタンスを割り当てることはできません。

于 2013-05-03T17:44:12.570 に答える