2

オブジェクトの 2 次元配列を作成しようとしています。作成したクラスのコンストラクターを、パラメーターを受け取るコンストラクターと等しく設定しようとしています。ただし、次のようなエラーが表示され続けます。

main.cpp:18:37: エラー: 'test*' から 'const test&' へのユーザー定義の変換が無効です

int main()
{
  test arr[9][9];
  char s[9][9];
  int integerArray[9][9];
  for(unsigned int i = 0; i < 9; i++)
  {
    for(unsigned int j = 0; j < 9; j++)
    {
      cin >> s[i][j];
      arr[9][9] = new test(s[i][j]);
    }
  }
  return 0;
}

テストがクラスです。誰でもこのエラーを理解するのを手伝ってもらえますか? 新しい関数が void ポインターを返すことは理解していますが、2 次元配列がパラメーターを受け取るようにするにはどうすればよいですか?

ありがとう。

4

4 に答える 4

2

test2 次元配列は、オブジェクトへのポインターの配列ではありません。とにかく、メモリは2次元配列に割り当てられます。したがって、ループは必要ありません。

宣言を変更しない限り

test arr[9][9];

次のようなものに:

 test*** arr = new (test**)[rows];


  for(unsigned int i = 0; i < 9; i++)
    {
      for(unsigned int j = 0; j < 9; j++)
      {
         cin >> s[i][j];
         arr[i][j] = new test(s[i][j]);
      }
     }
于 2012-10-13T22:12:39.757 に答える
0

X へのポインターを X に代入しようとするため、コード内では基本的に型の不一致testtestあります。

デフォルトのコンストラクターを回避するより簡単な解決策は、特定のコンストラクターで vector を使用することです。

std::vector<std::vector<test, test(char(0))> > arr;
char a(0);
for (unsigned int i = 0; i < 9; ++i) {
  for (unsigned int j = 0; j < 9; ++j) {
    std::cin >> a;
    arr[i][j] = test(a);
  }
}
于 2013-08-06T07:41:18.620 に答える
0

配列を as として宣言するとtest arr[9][9]; 、メモリが割り当てられ、メンバーごとにデフォルトのコンストラクターが呼び出されます。newしたがって、新しいメモリを割り当てるために呼び出す必要はありません。あなたの目標は、testから読み取った値で構築されたオブジェクトの配列を持つことだと思いますstd::cin

次に、いくつかのオプションがあります。

  • 最も簡単な解決策は、ポインターの 2D 配列を使用することです。

次のようになります。

test* arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
  for(unsigned int j = 0; j < 9; j++)
  {
     cin >> s[i][j];
     arr[i][j] = new test(s[i][j]);
  }
}
  • プレーン オブジェクトの配列を (ポインターなしで) 保持したい場合はtest、次のいずれかを使用できます。

test::set(int)構築後に値を設定するメソッドを提供します。

test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
  for(unsigned int j = 0; j < 9; j++)
  {
     cin >> s[i][j];
     arr[i][j].set(s[i][j]);
  }
}

operator=(const test&)一時的にオブジェクトを構築し、それを使用して(またはoperator=(test &&)c ++ 11で)配列内のすでに割り当てられているオブジェクトに割り当てます。ここにはないことに注意してnewください:

test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
  for(unsigned int j = 0; j < 9; j++)
  {
     cin >> s[i][j];
     arr[i][j] = test(s[i][j]);
  }
}

または、placement new を使用します (これにより、事前に割り当てられたメモリ ブロックに新しいオブジェクトが構築されます)。

test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
  for(unsigned int j = 0; j < 9; j++)
  {
     cin >> s[i][j];
     new(&arr[i][j]) test(s[i][j]);
  }
}
  • そして最後の 1 つ: 静的な 2D 配列を使用する特別な理由がない場合は、STL コンテナーを使用してください。
于 2012-10-13T23:14:38.393 に答える
0

// 1 つの arg コンストラクターを持つクラス/2 次元配列を // new を使用してヒープに割り当てる必要があるデフォルト コンストラクターなし

class A
{
    public:

        A(int i):m_i(i)
        {
            cout<<"constructor called i="<<i<<endl;
        }
        ~A()
        {
            cout<<"destructor called i="<<m_i<<endl;
        }
        int get()
        {
            return m_i;
        }
        friend ostream& operator<<(ostream& os, const A& obj);
    private:
        int m_i;
};

ostream& operator<<(ostream& os, const A& obj)
{
    os<<obj.m_i;
    return os;
}


typedef unsigned char Byte;
int main()
{
    int m=4;
    int n=3;
    int s[4][3] = { {1,2,3},
                    {4,5,6},
                    {7,8,9},
                    {10,11,12}
                  };

//Allocate a buffer to hold the array, on heap
    Byte* pBuff = new Byte[sizeof(A)*m*n];
    for(int i=0;i<m;++i)
    {
        for(int j=0;j<n;++j)
        {
             A* p = new (pBuff+sizeof(A)*(n*i+j)) A(s[i][j]);
        }
    }

//Accessing array 
    A (*testArr)[3] = (A (*)[3])pBuff;
    for(int i=0;i<4;++i)
    {
        for(int j=0;j<3;++j)
        {
            cout<<"testArr["<<i<<"]["<<j<<"]="<<testArr[i][j]<<endl;
        }
    }
    //after you are done with the array of objects.
    for(int i=0;i<m;++i)
    {
        for(int j=0;j<n;++j)
        {
             A* p=(A*)(pBuff+sizeof(A)*(i*n+j));
             p->~A(); //call destructor for each object.

        }
    }
    delete[] pBuff; //Delete the buffer.
    return 0;
}
于 2013-07-31T09:21:08.500 に答える