Могу ли я использовать непостоянный размер массива для членов класса? - PullRequest
0 голосов
/ 29 апреля 2020

в коде ниже, uint16_t sine[ANGULAR_RESO] выдает ошибку non static member reference must be relative to specific object struct

class BLDCControl  {
    public:
        uint16_t ANGULAR_RESO;
        uint16_t sine[ANGULAR_RESO];
        uint16_t pwm_resolution = 16;

}

Что я делаю не так?

1 Ответ

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

Чтобы использовать класс в том виде, в котором он написан, ANGULAR_RESO должен быть постоянной времени компиляции, и таким образом он больше не является указанным c членом для каждого объекта. Это должно быть stati c. Если вам нужен переменный размер массива, используйте std::vector, как указано ниже

class BLDCControl  {
    public:

        uint16_t ANGULAR_RESO;
        std::vector<uint16_t> sine;
        uint16_t pwm_resolution = 16;

}

И если ANGULAR_RESO - это размер вашего массива (как предложено @ aschepler), вы можете go без него, потому что ваш std::vector имеет этот размер как частный член, и вы можете получить его значение с помощью std::vector<unit16_t>::size() метода

#include <cstdint>
#include <vector>
struct BLDCControl  {
    BLDCControl(uint16_t ANGULAR_RESO, uint16_t pwm_resolution_v = 16) :
            pwm_resolution {pwm_resolution_v},
            sine {std::vector<uint16_t>(ANGULAR_RESO)}{}

    std::vector<uint16_t> sine;
    uint16_t pwm_resolution;

};
int main(){

    BLDCControl u(4, 16);
    std::cout << "ANGULAR_RESO is:\t"  << u.sine.size();


}
...