回归ç­çº§æˆå‘˜æ˜¯ä¸å¥½çš„åšæ³•ï¼Ÿ

时间:2013-07-29 12:49:32

标签: c++ class encapsulation

å‡è®¾ï¼š

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;
}

6 个答案:

答案 0 :(得分:1)

通过这样åšï¼Œæ‚¨å¯ä»¥åœ¨ç±»ä¹‹å¤–更改ç§æœ‰æˆå‘˜å€¼ã€‚如果它是å的或好的,它å–决于你。但在我看æ¥ï¼Œå¦‚果我有ç§äººä¼šå‘˜ï¼Œé‚£ä¹ˆæˆ‘必须是唯一能改å˜å…¶ä»·å€¼çš„人。

答案 1 :(得分:1)

将指针返回给类的ç§æœ‰æˆå‘˜æ˜¯å¾ˆç³Ÿç³•çš„,因为它å¯èƒ½ä¼šç ´åå°è£…。有人å¯ä»¥åœ¨æ²¡æœ‰
的情况下改å˜ç§æœ‰å˜é‡çš„值 告知你的ç­çº§ã€‚但是,在您的ç­çº§çš„字段的返回副本中没有任何ä¸å¥½ã€‚ 当使用getterå’Œsetter时,如果没有类知é“它,就无法改å˜ç±»çŠ¶æ€ã€‚所以这很好。

删除数组åŽï¼Œä¸€åˆ‡çœ‹èµ·æ¥éƒ½ä¸é”™ã€‚

答案 2 :(得分:1)

如果通过公共方法å‘ç§æœ‰æ•°æ®æˆå‘˜è¿”回指针或éžconst引用,则将其设为ç§æœ‰æ˜¯æ²¡æœ‰æ„义的。您也å¯ä»¥å…¬å¼€è¯¥ç‰©ä¸šã€‚

这基本上æ„味ç€æ‚¨å…许æ“纵类外的æˆå‘˜ã€‚ IMO这被认为是ä¸è‰¯åšæ³•ï¼Œç”šè‡³æ˜¯å模å¼ï¼Œå› ä¸ºè¯¥ç±»ä¸èƒ½ä¾èµ–于自己的状æ€ã€‚è¿™éžå¸¸é‡è¦ã€‚

例如:å‡è®¾ä½ æœ‰ä¸€ä¸ªæŒ‡é’ˆï¼Œæœ‰äººå°†å®ƒè®¾ç½®ä¸ºnull。å³ä½¿ç§äººæ–¹æ³•ä¹Ÿéœ€è¦æ£€æŸ¥å®ƒï¼Œå³ä½¿å†…部无法达到这ç§çŠ¶æ€ã€‚

返回正常æˆå‘˜ï¼Œä¾‹å¦‚类被视为ä¸è‰¯åšæ³•ï¼Œå› ä¸ºå®ƒæ¶‰åŠå¤åˆ¶æ•´ä¸ªå¯¹è±¡ã€‚通常最好返回引用或最好是const引用。

å过æ¥ï¼Œgetters会å…许你放置const个约æŸã€‚在两ç§æƒ…况下,指针和引用。

å¦è¯·æ³¨æ„,在这ç§æƒ…况下,通常会æ供两ç§æ–¹æ³•ã€‚ computeå’Œget。目å‰ï¼Œæ‚¨åªèƒ½é€šè¿‡è®¡ç®—æ¥è®¿é—®æ‚¨çš„会员ï¼

我ä¸ä¼šå»ºè®®ä½ åˆ‡æ¢åˆ°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个é™å®šç¬¦ã€‚ä¿æŠ¤æ¯ä¸ªçº§åˆ«çš„指针引用éžå¸¸é‡è¦ã€‚

答案 3 :(得分: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的实例ä¸ä¼šè¢«ç ´å,例如超出范围。

答案 4 :(得分:1)

  1. 这很糟糕,因为您正在使用写入æƒé™è¿”回ç§æœ‰å˜é‡ï¼Œä¹Ÿè®¸å®ƒä¸æ˜¯é‚£ä¹ˆç§å¯†
  2. 很糟糕,因为你è¦è¿”回一个指针,在这ç§æƒ…况下,ä¸æ¸…楚è°æœ‰è´£ä»»é‡Šæ”¾å†…存:这个类是因为它是自己的æˆå‘˜è¿˜æ˜¯ç”¨æˆ·ï¼Œå› ä¸ºä»–调用了这个方法?

答案 5 :(得分:0)

如果您希望该类æˆå‘˜åœ¨ç±»å¤–部å¯è¯»ï¼Œåˆ™å®Œå…¨ä¾èµ–于您å°è¯•å®Œæˆçš„æ“作,那么对类方法进行é‡æ–°ç¼–写是完全正确的。至于使用getter方法,你已ç»æ˜¯;它是&#34;良好实践&#34;使用此类方法为您的类创建更统一,å°è£…的设置,从而使以åŽæ›´å®¹æ˜“编辑该类。å³ä½¿ä½ çš„函数åšäº†å…¶ä»–事情(在这ç§æƒ…况下,计算二维的东西),它ä»ç„¶æ˜¯ä¸€ä¸ªgetter方法。

但是,在这ç§ç‰¹æ®Šæƒ…况下,您ä¸ä¼šè¿”回值;你正在返回一个指å‘值的åŒæŒ‡é’ˆã€‚è¿™æ„味ç€ç”¨æˆ·å°†èƒ½å¤Ÿç¼–辑数æ®ï¼ˆæˆ‘猜测是一个数组),这是一个ä¸é”™çš„类。事情。您应该在返回数æ®ä¹‹å‰æ‰§è¡Œæ•°æ®çš„深层å¤åˆ¶ã€‚

正确使用垃圾收集器:是的,你是。虽然它在C ++中ä¸è¢«ç§°ä¸ºåžƒåœ¾æ”¶é›†å™¨ï¼Œä½†å®ƒç®€ç§°ä¸ºé‡Šæ”¾å†…å­˜;垃圾收集器是自动释放内存的系统的å称。