Как вызвать конструктор класса из другого файла? - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть 4 файла water.h water.cpp ofApp.h ofApp.cpp

water.h

typedef struct _coordinate {
int x, y;}coordinate;

class water{
public:
    water(int num_of_line);
    ~water();

    void draw();
    void reset();

    int water_draw_flag;    // flag
    float local_r, local_g, local_b; // color of line


    coordinate* path;
    int num_of_path; };

water.cpp

#include "water.h"

water::water(int num_of_line)
{
   int num_of_path = num_of_line * 2 + 2;

if (!path) {
    path = (coordinate*)malloc(sizeof(coordinate)*(num_of_path+1));
    for (int i = 0; i < num_of_path+1; i++) {
        path[i].x = path[i].y = -1;
    }
}

water_draw_flag = 0;
}
~~~~~

ofApp.h

#include "water.h"
#include <vector>

~~~~~

void initializeWaterLines(); 

vector<water> wa;

ofApp.cpp

#include "ofApp.h"

~~~~~
void ofApp::initializeWaterLines() {
int i = 0;
int num = 50;
int local_x, local_y;
water init(num_of_line);
wa.assign(num, init);

~~~~~}

Я построилкласс воды 'init', но num_of_path и путь внутри класса воды не инициализированы. Почему он не инициализируется?

1 Ответ

3 голосов
/ 02 декабря 2019

Эта строка

   int num_of_path = num_of_line * 2 + 2;

в конструкторе создает локальную переменную, которая затмевает переменную-член. Избавьтесь от int и все заработает. Еще более предпочтительным было бы использование списка инициализации члена.

Проверка if(!path) - это неопределенное поведение, поскольку инициализация по умолчанию path отсутствует, это просто некоторый случайный указатель, а не nullptr,Я бы просто удалил проверку, потому что нет никакой возможности, чтобы путь имел инициализированное значение в этой точке.

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