返回指向const 2-d数组(C ++)的指针的函数

时间:2010-06-24 18:39:51

标签: c++ arrays pointers

我是一个间歇性的程序员,似乎最近忘记了许多基础知识。

我创建了一个类SimPars来保存几个二维数组;下面显示的是demPMFs。我将指向SimPars的实例的指针传递给其他类,我希望这些类能够使用SimPars访问器函数读取数组。速度和记忆很重要。

我知道生活对于矢量来说往往更简单,但在这种情况下,我真的很想坚持使用数组。

如何为数组编写访问器函数?如果我对第n个数组索引感兴趣,我将如何使用返回的指针访问它? (我应该为数组的特定索引编写单独的访问器函数吗?)以下内容肯定是错误的。

// SimPars.h
#ifndef SIMPARS_H
#define SIMPARS_H
#include "Parameters.h" // includes array size information

class SimPars {
 public:
  SimPars( void );
  ~SimPars( void );

  const double [][ INIT_NUM_AGE_CATS ] get_demPMFs() const;

 private:
   double demPMFs[ NUM_SOCIODEM_FILES ][ INIT_NUM_AGE_CATS ];

};
#endif


// SimPars.cpp
SimPars::SimPars() {
 demPMFs[ NUM_SOCIODEM_FILES ][ INIT_NUM_AGE_CATS ];
 // ...code snipped--demPMFs gets initialized...
}

//...destructor snipped
const double [][ INIT_NUM_AGE_CATS ] SimPars::get_demPMFs( void ) const {
  return demPMFs; 
}

我非常感谢对提议的解决方案进行某种解释。

3 个答案:

答案 0 :(得分:3)

基本上,您有三个选项:通过引用返回整个数组,通过指针返回第一行,或者通过指针返回整个数组。以下是实施:

typedef double array_row[INIT_NUM_AGE_CATS];

typedef array_row array_t[NUM_SOCIODEM_FILES];

array_t demPMFs;

const array_t& return_array_by_reference() const
{
    return demPMFs;
}

const array_row* return_first_row_by_pointer() const
{
    return demPMFs;
}

const array_t* return_array_by_pointer() const
{
    return &demPMFs;
}

以下是用例:

SimPars foo;

double a = foo.return_array_by_reference()[0][0];
double b = foo.return_first_row_by_pointer()[0][0];
double c = (*foo.return_array_by_pointer())[0][0];
  

我如何只返回数组的第n行?

同样,您有三种选择:

const array_row& return_nth_row_by_reference(size_t row) const
{
    return demPMFs[row];
}

const double* return_first_element_of_nth_row_by_pointer(size_t row) const
{
    return demPMFs[row];
}

const array_row* return_nth_row_by_pointer(size_t row) const
{
    return demPMFs + row;
}

答案 1 :(得分:1)

const double (* get_demPMFs() const)[INIT_NUM_AGE_CATS];

或者,使用typedef(但这看起来并不干净......)。

class SimPars {
    typedef const double (*ConstDemPMFType)[INIT_NUM_AGE_CATS];

    double demPMFs[NUM_SOCIODEM_FILES][INIT_NUM_AGE_CATS];
public:
    ConstDemPMFType get_demPMFs() const;
};

请注意,您无法返回数组(g++拒绝编译)。但是数组数组可以衰减为指向数组的指针,因此返回后者。

答案 2 :(得分:0)

从逻辑上讲,数据成员存在这个问题。是否允许用户修改它。如果您想让另一个类完全访问该成员,则不一定需要getter / setter,尤其是如果您是唯一的用户。您可以将该成员公开。

如果您的班级最好控制用户访问该成员的方式,那么您只能使用getter来强制执行只读访问。如果你不想对二维数组感到困惑,最简单的方法就是只有一个内联函数来获取用户类的元素:

const double& getElem( int x, int y ) const { return demPMF[x][y] }

在这里进行边界检查是有意义的,但考虑到你坚持使用数组,如果你的探查器证明你买不起,这个函数只允许访问你的数组。

如果您想进一步详细说明,请发表评论......