Указатель (адрес) с оператором 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);
Другие вопросы по тегам