Domanda

Ciao ho una classe pompa che richiede l'utilizzo di una variabile membro che è un puntatore a una matrice wchar_t contenente l'indirizzo della porta cioè:. "Com9"

Il problema è che quando ho inizializzo questa variabile nel costruttore miei flag di compilazione di un avvertimento di conversione ammortizzato.

pump::pump(){
   this->portNumber = L"com9";}

Questo funziona bene, ma l'avviso ogni volta che è in fase di compilazione anoying e mi fa sentire come sto facendo qualcosa di sbagliato.

Ho cercato di creare una matrice e quindi impostando la variabile membro così:

pump::pump(){
   wchar_t port[] = L"com9";
   this->portNumber = port;}

Ma per qualche ragione questo rende il mio punto portNumber a 'F'.

Chiaramente un altro problema concettuale da parte mia.

Grazie per l'aiuto con le mie domande noobish.

EDIT:

Come richiedere la definizione di portNumber era:

    class pump
{
private:
   wchar_t* portNumber;
}

Grazie alle risposte ora è stato cambiato in:

    class pump
{
private:
   const wchar_t* portNumber;
}
È stato utile?

Soluzione

Se portNumber è un wchar_t*, dovrebbe essere un const wchar_t*.

letterali

??String sono immutabili, quindi gli elementi sono const. Esiste una conversione deprecato dalla stringa letterale al puntatore non-const, ma questo è pericoloso. Apportare la modifica in modo che stai sicurezza di tipo tenuta e che non utilizzano la conversione non sicuri.

Il secondo esito negativo poiché si punta il contenuto di una variabile locale. Al termine del costruttore, la variabile va via e sei che punta a una posizione non valida. Utilizzando si traduce in un comportamento indefinito.

Infine, utilizzare un elenco di inizializzazione:

pump::pump() :
portNumber(L"com9")
{}

L'elenco di inizializzazione è di inizializzare, il costruttore è quello di terminare la costruzione. (Inoltre, this-> è brutto a quasi tutte le persone C ++;. Non è bello e ridondante)

Altri suggerimenti

Usa const wchar_t* a punto in un letterale.

Il motivo esiste la conversione è perché è stato validato da prime versioni di C per assegnare un letterale stringa a un puntatore non-const [*]. Il motivo è deprecato è che è valida per modificare un letterale, ed è rischioso utilizzare un puntatore non-const per riferirsi a qualcosa che non deve essere modificato.

[*] C non ha originariamente hanno const. Quando è stato aggiunto const, chiaramente deve applicarsi a stringhe letterali, ma c'era già il codice là fuori, scritto prima che esistesse const, che si romperebbe se improvvisamente si doveva cospargere const ovunque. Stiamo ancora pagando oggi per rompere il cambiamento che alla lingua. Dal momento che di C ++ si sta utilizzando, non era nemmeno una modifica sostanziale a questa lingua.

A quanto pare, è un portNumber wchar_t * (non-const), giusto? Se è così:

  • il primo è sbagliato, perché stringhe sono di sola lettura (sono puntatori const ad un array di char solitamente memorizzati nella tabella di stringhe dell'eseguibile, mappato in memoria da qualche parte, spesso in una pagina di sola lettura).
    Il brutto, conversione implicita di non-const chars / wchar_ts è stato approvato, IIRC, per ottenere la compatibilità con il vecchio codice scritto quando const non ha nemmeno esistesse; purtroppo, lascia un sacco di idioti che non sanno cosa const correttezza significa farla franca con la scrittura di codice che chiede puntatori non-const anche quando puntatori const sarebbe la scelta giusta.

  • Il secondo è sbagliato, perché si sta facendo il punto portNumber ad una variabile allocata sullo stack, che viene eliminato quando i rendimenti costruttore. Dopo il ritorno del costruttore, il puntatore memorizzato in punti portNumber di spazzatura casuale.

L'approccio corretto è quello di dichiarare portNumber come const wchar_t * se non ha bisogno di essere modificato. Se, invece, ha bisogno di essere modificati durante la vita della classe, di solito l'approccio migliore è quello di evitare le stringhe in stile C a tutti e solo gettare in un std::wstring, che si prenderà cura di tutto la contabilità associato con la stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top