å‡è®¾ï¼š
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;
}
ç”案 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)
ç”案 5 :(得分:0)
如果您希望该类æˆå‘˜åœ¨ç±»å¤–部å¯è¯»ï¼Œåˆ™å®Œå…¨ä¾èµ–于您å°è¯•å®Œæˆçš„æ“作,那么对类方法进行é‡æ–°ç¼–写是完全æ£ç¡®çš„。至于使用getteræ–¹æ³•ï¼Œä½ å·²ç»æ˜¯;它是&#34;良好实践&#34;使用æ¤ç±»æ–¹æ³•ä¸ºæ‚¨çš„类创建更统一,å°è£…的设置,从而使以åŽæ›´å®¹æ˜“编辑该类。å³ä½¿ä½ 的函数åšäº†å…¶ä»–事情(在这ç§æƒ…况下,计算二维的东西),它ä»ç„¶æ˜¯ä¸€ä¸ªgetter方法。
但是,在这ç§ç‰¹æ®Šæƒ…况下,您ä¸ä¼šè¿”回值;ä½ æ£åœ¨è¿”回一个指å‘值的åŒæŒ‡é’ˆã€‚è¿™æ„味ç€ç”¨æˆ·å°†èƒ½å¤Ÿç¼–辑数æ®ï¼ˆæˆ‘猜测是一个数组),这是一个ä¸é”™çš„类。事情。您应该在返回数æ®ä¹‹å‰æ‰§è¡Œæ•°æ®çš„深层å¤åˆ¶ã€‚
æ£ç¡®ä½¿ç”¨åžƒåœ¾æ”¶é›†å™¨ï¼šæ˜¯çš„ï¼Œä½ æ˜¯ã€‚è™½ç„¶å®ƒåœ¨C ++ä¸ä¸è¢«ç§°ä¸ºåžƒåœ¾æ”¶é›†å™¨ï¼Œä½†å®ƒç®€ç§°ä¸ºé‡Šæ”¾å†…å˜;垃圾收集器是自动释放内å˜çš„系统的å称。