Борьба с объявлением атрибутов класса в заголовочном файле C ++? - PullRequest
1 голос
/ 26 апреля 2020

Будучи новичком в C ++, я часто сталкиваюсь с проблемой объявления атрибутов класса внутри заголовочного файла, которым требуется больше информации, чем просто имя, например массивы и объекты других классы с конструкторами.

Вот пример

SomeClass.h:

#include "OtherClass.h"

class SomeClass {

  int num; // works fine
  float arr[]; // produces an error because size is not declared

  OtherClass obj; // produces an error because the constructor parameters are not passed in

public:
  void setup();
  void update();

};

SomeClass. cpp:

#include "SomeClass.h"

void SomeClass::setup() {
  num = 10; // easy peasy, works!
  arr = float some_arr[5 * num]; // error

  // Fill in the array
  for (int i = 0; i < 5 * num; i += num) {
    ass[i] = 12;
  }

  // Fill in the class attributes
  obj = {120, 40}; // error

}

void SomeClass::update() {
  // Update stuff
}

В случае массива arr как я могу объявить массив, если я не знаю его размер на момент объявления в файле заголовка?

Как можно объявить объекты класса с конструкторами в файле заголовка, не передавая неизвестные параметры в тот момент?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

В случае массива arr, как я могу объявить массив, если я не знаю его размер на момент объявления в заголовочном файле?

Вы можете «т! C ++ не поддерживает массивы переменной длины , хотя некоторые компиляторы (например, G CC) добавляют поддержку для них в качестве расширения.

Вместо этого следует учитывать используя тип контейнера std::vector из Стандартной библиотеки шаблонов .

В вашем заголовке / объявлении:

class SomeClass {
    int num; // works fine
//  float arr[]; // produces an error because size is not declared
    std::vector<float> arr;
    //...
};

И, для Ваша setup() функция:

void SomeClass::setup() {
    num = 10; // easy peasy, works!
//  arr = float some_arr[5 * num]; // error
    arr.resize(5 * num); // Sets the size of the container
    // Fill in the array...
    for (int i = 0; i < 5 * num; i += num) {
        arr[i] = 12; // You can access (valid) elements just like a normal array!
    }
    //...
}
1 голос
/ 26 апреля 2020

В случае, если вы не знаете размер массива заранее, вы можете использовать динамическое выделение c в C ++.

Сначала объявите переменную массива следующим образом

float *arr;

Затем Вы можете выделить необходимый размер следующим образом:

arr=new float[10]; 

Чтобы освободить память

delete[] arr;

Если вы хотите динамически распределять объекты, тогда объявите класс как

ClassName *obj;

Затем allocate use

 obj=new ClassName(your_parameters);

Затем вы можете удалить его, используя

delete obj;

СОВЕТ: Хорошей практикой всегда является указатель переменной NULL после освобождения памяти. Do arr = NULL; и obj = NULL; после отмены выделения

...