C ++ массив переменных в задаче класса - PullRequest
0 голосов
/ 07 января 2011

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

Функция initModulation создаст массив типа int размера M и комплексный массив размера M. (Complex - это другой класс, состоящий из реального компонента и мнимого компонента.

Функция модулирования должна иметь возможность доступа к этим двум массивам.Эти два массива выходят из области видимости после вызова функции модуляции init.Чтобы избежать этого, я бы просто сделал эти два члена данных класса Modulator, однако я не могу этого сделать, потому что размер массива зависит от M.

class Modulator
{
    int M;
    double phase;
    std::string mapping;

public:
    void initModulation(int M, double phase, std::string mapping);
    double* modulate(int *input,int inputlength,int complexFlag);
};

Есть какие-нибудь идеи по этому поводу?

Спасибо, Мин

Ответы [ 3 ]

1 голос
/ 07 января 2011

I was wondering if there was a way to include a data member which is an array of unfixed size.

STL, вероятно, то, что вы ищете. (std::vector ...

1 голос
/ 07 января 2011
  1. Не пишите функции инициализации без особых обстоятельств;Конструкция с помощью конструктора.

  2. Массивы являются логической частью данных класса, так как они используются для модуляции, и именно это делают экземпляры класса.Поэтому вы должны иметь их в качестве членов.

  3. Вы планировали создать массивы с неизвестным размером во время компиляции, верно?Какое значение имеет то, храните ли вы их как членов класса или нет?В любом случае, у вас есть информация о M на данный момент, и вы используете ее соответствующим образом.

  4. Но вам все равно не следует выделять свои собственные массивы.Используйте std::vector.В конце концов, вы достаточно умны, чтобы использовать std::string для текстовых данных, поэтому ...

  5. Зачем вам использовать int для параметра, который предположительно является своего рода "флаг"?C ++ имеет настоящий логический тип, называемый bool.Используйте его.

  6. Для ввода и вывода модуляции снова используйте векторы.

  7. Наличие класса с функцией-членом, имя которой выравниваетсяс именем класса подозрительно.Многие языки поддерживают идею «вызываемого» объекта, и C ++ входит в их число.В C ++ мы пишем эту функцию "operator()".

Таким образом:

class Modulator
{
    std::vector<int> int_data;
    std::vector<Complex> complex_data;
    double phase;
    std::string mapping;

    public:
    Modulator(int M, double phase, std::string mapping): 
    int_data(M), complex_data(M), phase(phase), mapping(mapping) {}

    std::vector<double> operator()(const std::vector<int>& input, bool is_complex);
};

Добро пожаловать в современный C ++.:)

1 голос
/ 07 января 2011

Вы можете использовать класс std::vector, который похож на массив, но имеет переменный размер и не требует явного управления памятью.Если вы объявите один элемент данных, тогда вы можете initModulation заполнить его таким количеством элементов, которое ему нравится, но затем иметь данные, доступные в modulate.

Одно предложение - это может бытьхорошая идея изменить initModulation на конструктор класса.Таким образом, он вызывается автоматически, и нет риска вызвать modulate без предварительной инициализации объекта.

...