在C ++中将数组作为对象返回

时间:2017-05-26 19:20:42

标签: c++ arrays class object

我刚刚进入C ++并对以下主题进行了一些讨论:

我有一个带有3个double值的Class,我将对象“supportRefl [4]”创建为数组。

我现在想要在“Scattering”类的函数“position”中返回数组,但我找不到相应的方法。

如果你能告诉我怎么做,我们将不胜感激。

继承班级:

class Quelle
{
private:
    double distanceq;
    double elevationq;
    double azimuthq;

public:
    void SetValue(double distance, double elevation, double azimuth);
    double Getd(){return distanceq;}
    double Gete(){return elevationq;}
    double Geta(){return azimuthq;}

Quelle(double distance=0, double elevation=0, double azimuth=0); 
//constructor
~Quelle(); //destructor
};

void Quelle::SetValue(double distance, double elevation, double 
azimuth)
{
    distanceq = distance;
    elevationq = elevation;
    azimuthq = azimuth;
}

Quelle::Quelle(double distance, double elevation, double azimuth) 
//constructor
{
}

Quelle::~Quelle() // destructor
{
}

这里的函数我想将数组返回: 我红了,你有一个指向数组第一个地址的指针,但它根本不起作用。

*double Scattering::position(const double &distance, const double &elevation, const double &azimuth, const double &intensity)
{
    double intensity_position = intensity * 10 * 5;

    m[0] = distance;
    m[1] = elevation;
    m[2] = azimuth;

    double lo[3] = {m[0], m[1]+intensity_position, m[2]-intensity_position}; //zusammenfassen
    double ro[3] = {m[0], m[1]+intensity_position, m[2]+intensity_position};
    double lu[3] = {m[0], m[1]-intensity_position, m[2]-intensity_position};
    double ru[3] = {m[0], m[1]-intensity_position, m[2]+intensity_position};

    //create instances
    Quelle upperLeft(0,0,0);
    Quelle upperRight(0,0,0);
    Quelle lowerLeft(0,0,0);
    Quelle lowerRight(0,0,0);

    const int NUMBER = 4;

    Quelle supportRefl[NUMBER];

    supportRefl[0].SetValue(lo[0],lo[1],lo[2]);
    supportRefl[1].SetValue(ro[0],ro[1],ro[2]);
    supportRefl[2].SetValue(lu[0],lu[1],lu[2]);
    supportRefl[3].SetValue(ru[0],ru[1],ru[2]);

    return supportRefl[];

}

非常感谢你的帮助, 欢呼西蒙

3 个答案:

答案 0 :(得分:1)

使用C ++不能按值返回原始数组。正如其他人所建议的那样,您可以使用std::array这是一个简单包装原始数组的struct

例如:

typedef std::array<Quelle,4> QuelleX4;

QuelleX4 Scattering::position(const double &distance, const double &elevation, const double &azimuth, const double &intensity)
{
    QuelleX4 supportRefl;
    supportRefl[0].SetValue(lo[0],lo[1],lo[2]);
    supportRefl[1].SetValue(ro[0],ro[1],ro[2]);
    supportRefl[2].SetValue(lu[0],lu[1],lu[2]);
    supportRefl[3].SetValue(ru[0],ru[1],ru[2]);
    return supportRefl;
}

或者,定义您自己的struct或使用std::vector,但这会在堆上分配,因此需要付出代价。

答案 1 :(得分:0)

问题是你正在尝试返回一个在堆栈上分配的数组,当函数结束时,这个数组被删除,所以你要么必须在堆上创建这个数组

supportRefl = new Quelle[NUMBER]

并且记得稍后删除它,这是一个不好的做法,所以你可以用像unique_ptr或shared_ptr这样的智能指针替换指针

std::unique_ptr<Quelle[]> supportRefl = make_unique<Quelle[]>(NUMBER)

或在某处创建一个数组并将其作为参数传递给函数。

*double Scattering::position(const double &distance, const double 
&elevation, const double &azimuth, const double &intensity, Quelle * arrayToFill)

或者你可以返回std :: vector或std :: array

最简单的选项可能是std :: vector和std :: array。

答案 2 :(得分:0)

ID   data1   data2   ...   copyID
15      a       b            NULL
16      c       d             11
17      a       b             15
18      c       d             16

这可能是一个静态类方法。