Указатель (адрес) с оператором if
У меня был рабочий код, который дал мне адрес меша (если я прав):
MyMesh &mesh = glWidget->mesh();
Теперь я хочу назначить разные адреса сетки. Одна из них - первая функция mesh(), а другая - mesh(int): как это сделать?
MyMesh &mesh; //error here: need to be initialized
if(meshNum==0){
mesh = glWidget->mesh();
}
else if (meshNum==1){
mesh = glWidget->mesh(0);
}
else{
return;
}
//mesh used in functions...
function(mesh,...);
3 ответа
Если ваш случай достаточно прост, что meshNum
ограничен, вы можете использовать ?:
оператор:
MyMesh &mesh = (meshNum == 0) ? glWidget->mesh() : glWidget->mesh(0);
В противном случае вам нужен указатель, так как ссылки должны быть инициализированы в точке определения и не могут быть повторно установлены для ссылки на что-либо еще.
MyMesh *mesh = 0;
if( meshNum == 0 ) {
mesh = &glWidget->mesh();
} else if ( meshNum == 1 ){
mesh = &glWidget->mesh(0);
}
function( *mesh, ... );
Ссылки должны быть связаны с объектом при инициализации... у вас не может быть инициализированной по умолчанию или нулевой инициализированной ссылки. Так что код вроде:
MyMesh &mesh;
где mesh
является непостоянной ссылкой на значение l к Mesh
объект, по сути своей плохо сформирован. В точке объявления вы должны привязать непостоянную ссылку к действительному адресуемому в памяти объекту.
Ссылки действительны в любое время в программе с хорошим поведением, поэтому нет, вы не можете этого сделать. Однако почему бы просто:
if(meshNum != 0 && meshNum != 1)
return;
function((meshNum == 0) ? glWidget->mesh() : glWidget->mesh(0));
Или вы можете просто использовать указатель и почтить его позже:
MyMesh *mesh = 0;
if(meshNum==0) {
mesh = &glWidget->mesh();
}
else if (meshNum==1) {
mesh = &glWidget->mesh(0);
}
else {
return;
}
function(*mesh);