-3

私はそのようなコードを持っています:

template <class T>
struct Rgb
{
    T *r, *g, *b;

    Rgb(int nr, int ng, int nb)
    {
        r = new T(nr);
        g = new T(ng);
        b = new T(nb);
    }

    Rgb(int n)
    {
        Rgb(n, n, n);
    }

    ~Rgb()
    {
        delete r;
        delete g;
        delete b;
    }
};

次のようなオブジェクトを作成できるようにしたいので、そのようにしました。

    Rgb<std::vector<int>> a(10); // so it creates 3 vectors inside,
        // each with 10 elements or

    Rgb<std::deque<double>> a(2, 5, 4); // so it creates 3 deques inside
        // with different sizes

しかし、上記の実装は機能しません。助けてください...ありがとう...

4

1 に答える 1

1

コンパイラがコンストラクター委任をサポートしている場合(たとえば、Clang 3.2 がサポートしている場合)、次のことができます。

    Rgb(int n) : Rgb(n, n, n)
    {
    }

あなたがしていることは、コンストラクターで一時的な Rgb インスタンスを構築することです。これは、初期化されていない が失敗し、r削除されますgb

それ以外の場合は、初期化を行う共通init関数を作成するか、単にコードを複製することをお勧めします。そして、コメントが指摘しているように、newここでは使用しないでください (これは、ほとんどの場合、最新の C++ コードのコード臭です)。これをまとめると:

template <class T>
struct Rgb
{
    T r, g, b;

    Rgb(int nr, int ng, int nb) : r(nr), g(ng), b(nb)
    { }

    Rgb(int n) : r(n), g(n), b(n)
    { }

    ~Rgb()
    { }
};
于 2013-02-01T17:14:31.810 に答える