сеттер для вектора <someClass>в c ++ - PullRequest
5 голосов
/ 18 декабря 2010

У меня есть следующие классы:

class Vertex {

public: float X;
        float Y;
        float Z;

Vertex (float first, float second, float third){
          X=first;
          Y=second;
          Z=third;
    }

};


class Obj {


  vector<Vertex>vertexCoordinates;

  vector<vector<int>> faces;

  vector <vector<float>> faceNormals;

  vector <vector<float>> faceCenters; 

  string objName; 

  int vertexCount, faceCount, edgeCount;

  float maxX, minX, maxY, minY, maxZ, minZ, dx, dy, dz;


    setVertexCoordinates(vector <Vertex> vertexCoordinatesP) {

          vertexCoordinates = vertexCoordinatesP; //??
         // How should the assignment be defined? 

    }

};

Нужно ли здесь создавать конструктор копирования?Перегрузить оператора = для Vertex и Obj?

Ответы [ 4 ]

3 голосов
/ 18 декабря 2010

Поскольку ваш Vertex имеет только примитивные не указательные члены, вам не обязательно определять для него конструктор копирования: компилятор сгенерирует для вас , который копирует элементы по их копии конструкторы (в случае float, это обычно побитовая копия). Конструктор копирования и оператор присваивания для std::vector предопределены и будут работать здесь, потому что вы не храните указатели.

(Для std::vector<Vertex *> семантика владения не ясна, поэтому вам может потребоваться копировать другим способом.)

1 голос
/ 18 декабря 2010

Конструктор копирования, который вы получаете бесплатно от компилятора, прекрасно подойдет.То же самое касается оператора присваивания, который вы получаете бесплатно или в байтах в вашем исходном коде.Однако указанный вами конструктор исключает конструктор по умолчанию, предоставляемый компилятором, и вам нужен конструктор по умолчанию, чтобы ваш объект находился в стандартных контейнерах.

0 голосов
/ 19 декабря 2010

Вероятно, вам следует использовать POD, а не класс:

struct Vertex { float x; float y; float z; };

Чтобы обойти проблему отсутствия конструкторов, используйте фабрики:

inline Vertex mk_Vertex (float x, float y, float z) {
  Vertex a; a.x = x; a.y=y; a.z=z; return a; }

inline Vertex mk_Planar (float x, float y) {
  Vertex a; a.x=y; a.y=y; a.z=0.0f; }

Это дает вам несколько именованных конструкторов и оставляет Vertex POD, что означает, что вы также можете использовать инициализаторы в стиле C:

Vertex a = {1.0f, 2.0r, 3.0f };

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

0 голосов
/ 18 декабря 2010

Вам, вероятно, не нужно перегружать их, поскольку у вас нет указателей или неразделимых ссылок, таким образом, конструктор копирования \ оператор присваивания может обработать это правильно.

...