Получить массив из объекта в C ++ - PullRequest
0 голосов
/ 29 июня 2018

Этот вопрос может быть простым, но я никогда не использую сырые указатели или массивы в C ++, поэтому ...

Мне нужно использовать библиотечную функцию, которая выглядит следующим образом:

void f(double a[3][3], double b[3], double c[3]);

a и b используются для ввода, а результат сохраняется в c.

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

class X{
public:
X(){ 
    a = {{1,2,3},
         {4,5,6},
         {7,8,9}}; 
    }

private:
    double a[3][3];
}

Как написать геттер для X::a, который можно использовать в функции f?

Вот так я бы хотел вызвать функцию f:

#include "X.h"

int main(int argc, char *argv[]){

    X o = X(); //create object
    double a[3][3] = o.getA(); // I want to get a somehow
    double b[3] =  {1,2,3}; // create dummy b
    double c[3] = {}; // create empty c
    f(a,b,c); // call funktion to populate c
    for(int i=0; i<3; ++i){
        std::cout << c[i] << endl;
    }
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Этот фрагмент должен служить вашей цели.

#include <iostream>
#include <string>

using namespace std;

class X {
public:
    X() {
    }

    typedef double (*ptr_matrix)[3];

    ptr_matrix getA(){
        return a;
    }

private:
    double a[3][3] = {{ 1,2,3},
        {4,5,6},
        {7,8,9}};
};

void f(double a[3][3], double b[3], double c[3])
{
    cout<<"Inside f function";
    for(auto i = 0; i < 3;i++) {
        cout<<endl;
        for(auto j = 0 ; j < 3;j++)
            cout<<a[i][j];
    }
}

int main()
{
    X o = X(); //create object
    double (*a)[3] = NULL;
    a = o.getA(); // I want to get a somehow

    double b[3] = {0};
    double c[3] = {0};

    f(a,b,c);

}
0 голосов
/ 29 июня 2018

Вы знаете, std::vector - это путь для двумерных массивов в C ++, но если вы не можете обойти препятствие, с которым сталкиваетесь, тогда можно будет передать матрицу в качестве параметра к функции получения, как это:

#include <iostream>

class X {
 public:
    void getA(double (&array)[3][3]) {
        for (int i = 0; i < 3; ++i)
            for (int j = 0; j < 3; ++j)
                array[i][j] = a[i][j];
    }
 private:
    double a[3][3] = {{1,2,3},
            {4,5,6},
            {7,8,9}};
};

int main(void) {
    X o = X();
    double a[3][3];
    o.getA(a);
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            std::cout << a[i][j] << std::endl;
    return 0;
}
...