инициализировать массив в конструкторе - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу иметь класс, который имеет массив членов. Размер массива должен быть указан при инициализации объекта. Я только что нашел способ с помощью указателей сделать это. Я думаю, что это работает правильно, но вы можете сказать мне, если это лучший способ сделать это или есть какие-то вещи, которые не работают, которые я еще не узнал?

#include <iostream>
using namespace std;

class Surface {
  private:
    float dx;
    int N;
    float* mesh_points;

  public:
    Surface(float, int);
    ~Surface();
    void set_dx (float);
    float get_dx();
};

Surface::Surface(float dx,int N){
  this->dx = dx;
  this ->N = N;
  mesh_points = new float[N];
}


void Surface::set_dx (float dx) {
  this->dx = dx;
}


float Surface::get_dx (void) {
  return dx;
}

Surface::~Surface(){
  delete[] mesh_points;
}

int main () {
  Surface s(1.2,10);
  s.set_dx (3.3);
  cout << "dx: "<< s.get_dx() <<endl;

  float mesh_points[3];
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вот альтернативное предложение, которое позволяет вам сохранить вашу текущую реализацию, но намного безопаснее.

class Surface {
  private:
    float dx;
    int N;
    float* mesh_points;

  public:
    Surface(float, int);
    ~Surface();
    void set_dx (float);
    float get_dx();
    Surface(const Surface&) = delete;            // new
    Surface& operator=(const Surface&) = delete; // new
};

Удаляя реализацию конструктора копирования и оператора назначения копирования, вы не позволяете объектам Surfaceбудучи скопированным (что в любом случае может привести к сбою вашей программы).Любая попытка скопировать Surface объекты теперь приведет к ошибке времени компиляции.

Только предложение, мой первый выбор всегда будет использовать std::vector.

0 голосов
/ 17 сентября 2018

можете ли вы сказать мне, если это лучший способ сделать это или есть какие-то вещи, которые не работают, которые я еще не узнал?

Это будет мой взгляд на основе существующих лучших практик:

class Surface {
private:
    std::vector<float> mesh_points;

public:
    float dx;

    Surface(float dx, std::size_t n);
};

Surface::Surface(float dx, std::size_t n)
  : dx(dx)
  , mesh_points(n)
{
}

Короче, сделанные изменения:

Обратите внимание, что текущий интерфейс не разрешает доступ к mesh_points.

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