Pergunta

Considere o seguinte código:

const QString& MyClass::getID(int index) const
{
    if (i < myArraySize && myArray[i]) {
        return myArray[i]->id; // id is a QString
    } else {
        return my_global_empty_qstring; // is a global empty QString
    }
}

Como posso Evite ter um qString vazio sem alterar o tipo de retorno do método? (Parece que retornar um QString vazio alocado na pilha é uma má ideia)

Obrigado.

Foi útil?

Solução

Você não pode. Não retorne uma referência const ou use uma variável estática local como esta:

const QString& MyClass::getID(int index) const {
    if (i < myArraySize && (myArray[i] != 0)) {
        return myArray[i]->id; // id is a QString
    }

    static const QString emptyString;
    return emptyString;
}

A vantagem desse método sobre os outros métodos propostos é que esta solução não requer uma alteração na interface de MyClass. Além disso, o uso de um parâmetro padrão pode confundir os usuários da sua classe e levar ao uso de classe errada. Esta solução é transparente para o usuário.

A propósito, você está realmente usando uma matriz de estilo C em sua classe?

Outras dicas

Como isso deve devolver um const Valor Não vejo problema em ter um QString vazio global (ou estático) que é usado por todas essas funções para retornar uma string vazia.

Eu não sou selvagem com o nome. Eu esperaria que o QString "vazio" fosse um membro estático const da classe QString. Portanto, seu código ficaria assim.

const QString& MyClass::getID(int index) const
{
    if (i < myArraySize && myArray[i]) {
        return myArray[i]->id; // id is a QString
    } else {
        return QString::EmptyString; // is a global empty QString
    }
}

Você não pode evitá -lo sem alterar o tipo de retorno.

Se você optar por retornar uma referência, então você devo Tenha alguma variável do tipo de retorno que sobrevive ao escopo da função. Se você não pode alterar a API (por exemplo, devido a promessas de compatibilidade binária), estará bloqueado nisso para sempre. Você terá que desperdiçar memória armazenando algum valor do tipo relevante, mesmo se alterar o restante da implementação da sua classe para gerar os valores em tempo real ou recuperá -los de alguma fonte externa.

É por isso que os guias de design da API C ++ que estão cientes dos problemas de compatibilidade binária recomendam não retornar um const& sem consideração cuidadosa.

Que tal usar um valor padrão pré-inicializado:

const QString& MyClass::getID(int index, const QString& def = QString()) const
{
    if (i < myArraySize && myArray[index]) {
        return myArray[index]->id; // id is a QString
    } else {
        return def;
    }
}

Se você insistir em devolver uma referência, deve ter um objeto para se referir; Portanto, você deve ter o objeto QString em algum lugar do seu exemplo, não há maneira de contornar isso.

No entanto, uma técnica que parece adequada para o seu caso é alterar seu método para aceitar um ID padrão para retornar, caso o índice esteja fora do intervalo:

const QString& MyClass::getID( int i, const QString& default ) const
{
  if( i < myArraySize && myArray[i] )
    return myArray[i]->id;
  else
    return default;
}

Você também pode fazer uma exceção se o índice estiver fora de intervalo, então você não precisará retornar à falha, mas provavelmente não é isso que você deseja.

QString :: NULL seria suficiente?

Você não pode evitar a necessidade de um QString vazio sem mudar o caminho getId() funciona. Mas há duas abordagens que surgem à mente:

  • Em vez de retornar silenciosamente uma corda vazia, jogue uma exceção; ou
  • Não se preocupe em devolver uma referência e apenas devolver um QString, confiando Otimização do valor de retorno eliminar o custo de copiar o objeto.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top