0

ヘッダーファイルで配列を宣言したいのですが、クラスの構築時に配列のサイズを宣言したいのですが。これは可能ですか?このサイトで多くの配列宣言を見つけましたが、特にこれは見つかりませんでした。以下のコードを試してみると、「配列のバインドは']'トークンの前の整数定数ではありません」というエラーが表示されます。

foo.h

class foo{
   private:
      uint16_t _size;
      uint16_t array[_size];
   public:
      foo(uint16_t size);
      virtual ~foo();
}

foo.cpp

#include "foo.h"
foo::foo(uint16_t size)
:_size(size)  
{ 
}
4

6 に答える 6

1

それを行う1つの特定の方法はこれです

class foo
{
public:
   foo(uint16_t size);
private:
   uint16_t _size;
   uint16_t* array;
};

foo::foo(uint16_t size) :_size(size)
{
    array = new int[_size];
}

これにより、実行時に動的に配列を作成できるようになります。ただし、一般的にC ++(IMO)の配列よりもはるかに優れているため、std :: vectorを使用することをお勧めしますが、配列を使用する特別な理由がある場合は、私がやる方法。静的を使用するということは、そのクラスを他の場所で使用したい場合、_sizeがインスタンス間で同じ値を共有することを意味します。静的関数のみが静的メンバーにアクセスできるため、コンパイルされないと思います。

EDT:急いで答えるのですが、クラスが次のようにスコープ外になったときに配列を破棄するには、クラスにデストラクタを追加する必要があると言うのを忘れました。

foo:~foo()
{
    delete[] array;
}

三つのルールへの参照を追加したことがないため、反対票を投じました。理想的には、とにかく動的に初期化された配列を使用するのではなく、ベクトルを使用するだけです。ここに、3つのC++ルールの3つのルールへのリンクがあります。

于 2013-03-17T22:48:37.513 に答える
1

理想的には、次のように使用する必要がありますstd::vector<uint16_t>。サイズを動的に決定できます。

vector<uint16_t> array;
...
foo(size_t size) : array(size) {}
...

または、配列の代わりにポインタを使用して、コンストラクタに割り当て、デストラクタで削除することもできます。

uint16_t *array;
...
foo(size_t size) : array(new uint16_t[size]) {}
...
~foo() {delete[] array;}

デストラクタを定義したら、3のルールを処理する必要があるため、これはそれほど良くありません。

于 2013-03-17T22:48:52.710 に答える
1

本当に配列を使用する必要がある場合は、テンプレート パラメーターを使用して配列サイズを定義できます。

template<size_t N>
class foo{
private:
    uint16_t array[N];

public:
    foo()
    {
    }
};

foo<3> f;

std::vectorは C++ の動的配列であり、配列を操作するための豊富なインターフェイスを提供します。使用しない理由はほとんどありませんstd::vector

class foo{
private:
    std::vector<uint16_t> array;
   
public:
    foo(uint16_t size) : array(size)
    {
    }
};
于 2013-03-17T23:01:49.397 に答える
1

そんなことはできません。配列のサイズは、コンパイル時の定数でなければなりません。あなたの場合、クラス foo のインスタンスのサイズは配列のサイズに依存します。class を使用するたびにコンパイル時に含まれる配列のサイズがわかっている場合はfoo、テンプレートを使用できます。

template <size_t N>
class foo {
    uint16_t array[N];
public:
    foo() {}
};

それ以外の場合は、C++ によって提供されるサイズ変更可能な配列を使用する必要があります: std::vector:

class foo {
    std::size_t size;
    std::vector<uint16_t> array;
public:
    foo(std::size_t size_) 
    : size(size_)
    , array(size_)
    {}
};
于 2013-03-17T23:02:43.320 に答える
0

これは、静的変数を初期化する方法ではありません。方法は次のとおりです(通常はCPPファイルにあります)。

uint16_t foo::_size = /* something */;

しかし、静的変数は必要ないと思います。代わりに、動的に割り当てられた配列を使用することをお勧めします。

class foo{
   private:
      uint16_t _size;
      uint16_t* array;
      static uint16_t* copy(uint16_t* a, uint16_t s) {
          if (!a) return 0;
          uint16_t* ret = new uint16_t[s];
          for (int i = 0; i < s; i++) ret[i] = a[i];
          return ret;
      }
   public:
      foo(const foo& f) : _size(f._size), array(0) { array = copy(f.array, f._size); }
      foo(uint16_t size = 0) : _size(size), array(0) {
          if (size == 0) return;
          array = new uint16_t[_size];
      }
      ~foo() { delete[] array; }
}

さらに良い解決策は、などの標準ライブラリコンテナの1つを使用することstd::vectorです。

于 2013-03-17T22:49:15.670 に答える
0

ベクトルを使用します。

class foo{
   private:
      std::vector<uint16_t> array;
   public:
      foo(uint16_t size)
};

foo::foo(uint16_t size) : array(size)  
{ 
}
于 2013-03-17T22:50:47.610 に答える