Инициализировать вектор в классе? - PullRequest
0 голосов
/ 20 января 2020

Из предыдущего вопроса я узнал, что могу инициализировать 2D-векторы следующим образом:

vector<vector<double>> Example(3); 

вместо:

vector<vector<double>> Example={{},{},{}}

В этом случае у меня будет три "строки "доступно в примере, правильно?

Теперь я хочу, чтобы инициализация в классе:

    class Perceptron(){
     int NumbersOfRowsThatIwant;
     vector<vector<double>> Example(NumbersOfRowsThatIwant);
    };

Теперь номера строк определены только в конструкторе:

Perceptron::Perceptron(int x)
{
  NumberOfRowsThatIwant=x;
}

Но это, вероятно, неправильно, как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Кажется, вы имеете в виду следующее

#include <iostream>
#include <vector>

class Perceptron
{
public: 
    Perceptron( size_t n ) : Example( n ) {}

private:
    std::vector<std::vector<double>> Example;
};

int main() 
{
    Perceptron p( 3 );

    return 0;
}

Элемент данных int NumbersOfRowsThatIwant; является избыточным, поскольку вы всегда можете получить количество «строк», например Examp;le.size(). Например,

#include <iostream>
#include <vector>

class Perceptron
{
public: 
    using size_type = std::vector<std::vector<double>>::size_type;

    Perceptron( size_type n ) : Example( n ) {}

    size_type row_number() const { return Example.size( ); }
private:
    std::vector<std::vector<double>> Example;
};

int main() 
{
    Perceptron p( 3 );

    auto n = p.row_number();

    std::cout << n << '\n';

    return 0;
}

Вывод программы:

3

Если вы хотите иметь конструктор по умолчанию с предопределенным количеством «строк», вы можете определить класс, например,

#include <iostream>
#include <vector>

class Perceptron
{
public: 
    using size_type = std::vector<std::vector<double>>::size_type;
    Perceptron() = default;
    Perceptron( size_type n ) : Example( n ) {}

    size_type row_number() const { return Example.size( ); }
private:
    static const size_type DEFAULT_NUMBER = 3;
    std::vector<std::vector<double>> Example { DEFAULT_NUMBER };
};

int main() 
{
    Perceptron p( 3 );

    auto n = p.row_number();

    std::cout << n << '\n';

    Perceptron p2;

    n = p2.row_number();

    std::cout << n << '\n';

    return 0;
}
0 голосов
/ 20 января 2020

Для этого вы можете использовать список инициализатора элемента:

class Perceptron {
  private:
     int NumbersOfRowsThatIwant;
     vector<vector<double>> Example;
  public:
    Perceptron(int x);
};

Perceptron::Perceptron(int x): NumberOfRowsThatIwant(x),
                               Example(NumbersOfRowsThatIwant)
{ }

Но имейте в виду, что порядок инициализации зависит только от порядка объявления членов, а не от порядка в элементе список инициализаторов.

...