1

鉴于:

Class A
{
     private:
       double **CR;
     public:
       double **compute2D();
};

假设我有一个私有 2D 数组成员:

double **CR;

我有一个成员函数:

Double ** Compute2D()

函数computer2D将返回CR

这是一个不好的做法吗?为什么?我应该使用 getter 和 setter 函数来返回它吗?

还有一个问题:我是否正确使用了垃圾收集器?

A::~A()
{
    //Delete 2D array
    for(int i = 0; i < Rows; ++i)
    {
        delete [] CR[i];
    }

    delete [] CR;
}
4

6 回答 6

1

通过这样做,您可以在类之外更改私有成员值。它是坏的还是好的,取决于你。但在我看来,如果我有一个私人会员,那么我必须是唯一可以改变其价值的人。

于 2013-07-29T12:58:49.530 回答
1

返回指向类的私有成员的指针是不好的,因为它会破坏封装。有人将能够更改私有变量的值,而无需
通知您的班级。但是,您班级的字段的返回副本没有什么不好。使用 getter 和 setter 时,如果类不知道,就无法更改类状态。所以这是很好的做法。

删除数组后一切正常。

于 2013-07-29T12:59:37.987 回答
1

如果您通过公共方法返回对私有数据成员的指针或非常量引用,则将其设为私有是没有意义的。您也可以公开该属性。

这基本上意味着您允许在类之外操作成员。IMO 这被认为是一种不好的做法,甚至是一种反模式,因为该类不能依赖于它自己的状态。这个非常重要。

例如:假设你有一个指针,有人将它设置为null. 即使是私有方法也需要检查它,即使在内部这种状态是不可能达到的。

返回普通成员(例如类)被认为是一种不好的做法,因为它涉及复制整个对象。通常最好返回一个引用或者最好是 const 引用。

反过来,吸气剂将允许您设置const约束。在这两种情况下,指针和引用。

另请注意,在这种情况下,通常提供两种方法。computeget。目前您只能通过计算访问您的会员!

我不会建议您切换到,std::vector因为我不知道您需要什么,而且向量并不适合所有事情。所以坚持使用指针,这是安全的方法:

class A
{
     private:
       double **CR;
     public:
       double const * const * compute2D();
       double const * const * getCR();
};

double const * const * A::compute2D(){
 return CR;
}

double const * const * A::compute2D(){
 /*Heave CPU stuff*/
 return CR;
}

int main(){
A a;
double const* const* tmp = a.compute2D();
tmp[1][2] = 0; //this will fail to compile
tmp[1] = 0; //this will fail too

double get_test = tmp[1][2]; // this passes!
}

注意双重const限定符。保护每一级指针引用很重要。

于 2013-07-29T13:00:39.560 回答
1

返回一个班级成员是可以的。但是,在您的情况下,我会做的略有不同。您返回指向 2D 向量的指针。这样您就可以返回计算结果,而不必复制数据。并且由于它返回一个 const 值,您可以确定调用者将无法更改数据,但可以使用它来读取值。

Class B
{
     private:
       vector<vector<double> > CR; /*note space between > > is significant*/
     public:
       const vector<vector<double> >& compute2D(){ 
            /*do calculation here eg.*/
            return CR;
       }
};

而且由于我的示例显示了如何使用它来执行此操作,因此std::vector您不必担心删除动态保留的内存。如果您仍在使用引用变量,则必须确保实例Class B不被破坏,例如超出范围。

于 2013-07-29T13:00:59.900 回答
1
  1. 这很糟糕,因为您正在返回具有写访问权限的私有变量,也许它不是那么私密
  2. 这是不好的,因为你正在返回一个指针,在这种情况下,不清楚谁有责任释放内存:类是因为它是它自己的成员,还是用户因为他调用了方法?
于 2013-07-29T13:03:45.617 回答
0

如果您希望该类成员在类外部可读,则重新使用类方法非常好,这完全取决于您要完成的工作。至于使用getter方法,你已经是了;使用此类方法为您的类创建更统一、封装的设置是“好习惯”,因此以后可以更轻松地编辑该类。即使你的函数做了其他事情(在这种情况下,计算二维的东西),它仍然是一个 getter 方法。

但是,在这种特殊情况下,您没有返回值;而是返回值。您正在返回一个指向值的双指针。这意味着用户将能够在类之外编辑数据(我猜是一个数组),这不是一件好事。您应该在返回数据之前执行数据的深层复制。

至于正确使用垃圾收集器:是的,你是。虽然它在 C++ 中不叫垃圾收集器,但它只是简单地称为释放内存;垃圾收集器是自动释放内存的系统的名称。

于 2013-07-29T12:56:14.393 回答