Назначение массива объектов в другом конструкторе, где класс содержит констант - PullRequest
0 голосов
/ 25 сентября 2019

Я огляделся и нашел решение только для одной проблемы, которая конфликтует с другой.У меня есть класс A с некоторым константным членом и другими членами, которые должны быть инициализированы, класс B с некоторым конструктором и двумерный массив A

, например:

class A {
public:
  A();
  A(t, u);
  const int x = 5;

private:
  int _t;
  int _u;
}

class B {
public:
  B();
  A a[50][500];
}

A::A() {
  //nothing here
}

A::A(t, u) {
  _t = t;
  _u = u;
}

B::B() {
  for (int i=0; i<50; i++)
    for(int j=0; j<500; j++)
      a[i][j] = A(i, j);
}

Теперь это не 'не работает, потому что A имеет константный член, поэтому назначение завершается неудачно, потому что все a уже построены по умолчанию, и, очевидно, я не хочу кодировать 25000 значений инициализатора в списке инициализатора члена B, так что об этом не может быть и речи.

Мне нужен инициализатор по умолчанию, потому что в противном случае конструктор B выдаст ошибку, из-за которой я не могу инициализировать массив по умолчанию, поэтому мне нужен какой-то способ переназначения массива вновь созданным объектом A. Как я могу выполнитьэто?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Если вы хотите избежать инициализации массива по умолчанию, вы можете использовать std::vector<std::vector<A>> и заполнить его в конструкторе B:

class A {
public:
  A(t, u);
  const int x = 5;

private:
  int _t;
  int _u;
}

class B {
public:
  B();
  std::vector<std::vector<A>> a;
}

A::A(t, u) {
  _t = t;
  _u = u;
}

B::B()
: a(50) { // a will contain 50 empty rows
  for (int i=0; i<50; i++) {
    a[i].reserve(500); // allocates enough space in each row for at least 500 elements
    for(int j=0; j<500; j++)
      a[i].emplace_back(i, j); // constructs value in-place using given arguments
  }
}

Обратите внимание, что вам больше не нужен конструктор пустых параметров A,поэтому я удалил его.

0 голосов
/ 25 сентября 2019

Это то, что вы хотите?

class A {
public:
  A();
  A(int t, int u);
  const int x = 5;

  A& operator=(const A& a);
private:
  int _t;
  int _u;
};

class B {
public:
  B();
  A a[50][500];
};

A::A() {
  //nothing here
}

A& A::operator=(const A& a) {
    _t = a._t;
    _u = a._u;
}

A::A(int t, int u) {
  _t = t;
  _u = u;
}

B::B() {
  for (int i=0; i<50; i++)
    for(int j=0; j<500; j++)
      a[i][j] = A(i, j);
}

Вам просто не хватает оператора = 100 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...