Obținerea unei erori de timp de compilare atunci când se adaugă un șir la un caracter const * în C ++?

așa că încerc să convertesc o valoare întregă într-un șir și apoi să atașez șirul la un char const constând deja *. Dar, după cum am menționat, primesc această eroare:

eroare: expresia trebuie să aibă un tip enum integral sau nescoat.

  objDim + = objDimStr.c_str ();
 

Orice idei de ce? Codul meu este după cum urmează:

    const char* objDim = "The object dimension is: ";
    int objDimension = geo->Dimension();
    std::string objDimStr = std::to_string(objDimension);
    objDim += objDimStr.c_str();
0
Sunt adrese, așa că este ca și cum ați adăuga 1428, Elm Street la 946, Elderberry Road și așteptați ca Elderberry Road să se atașeze pe strada Elm.
adăugat autor molbdnilo, sursa

6 răspunsuri

objDim is a pointer. When you add to the pointer, you will add to the pointer itself and not append anything to the data it points to.

Și nu puteți adăuga totul la un pointer, practic doar valori întregi. Și adăugarea a două pointeri ca tine nu are nici un sens (de aceea nu este permisă).

Dacă doriți să adăugați șiruri de caractere, utilizați std :: string pentru șirurile toate .

În plus, că trebuie să utilizați calificatorul const ar trebui să dea, de asemenea, câteva sugestii despre faptul că indicatorul indică constant și, prin urmare, nu poate fi modificat ).


Și în acest caz nu aveți nevoie de varianta temporară objDimension sau objDimStr (dacă nu le folosiți mai târziu în cod):

std::string objDim = "The object dimension is: " + std::to_string(geo->Dimension());

Aici adăugarea funcționează deoarece există un operator supraîncărcat + funcția care ia argumentele corecte în ordinea corectă și returnează un nou obiect std :: string .

2
adăugat
@ Xyber101 Ei bine, deja par să știți despre funcția de membru c_str() ...
adăugat autor Some programmer dude, sursa
Bine, dar după ce fac asta voi fi lăsat cu un șir. Dar, am nevoie de o variabilă tip const char * pentru a putea să o transmit într-o funcție API pentru a afișa șirul de pe ecran. Semnătura funcției este: int RhinoMessageBox (const char * message, const char * title, tip UINT). Deci, cum să obțin un șir și apoi să îl transmit în funcție corespunzător?
adăugat autor Xyber 101, sursa

Presupun că te aștepți să obțineți o concatenare a șirurilor. Nu, nu funcționează. objDim este doar un indicator pentru o zonă de memorie care nu poate fi modificată care conține caractere. Singura aplicație posibilă a operatorului + = pe care l-ar compila este dacă l-ați incrementat cu câteva caractere:

objDim += 11;
std::cout << objDim << '\n';//prints "dimension is: ";

Pentru a concatena șiruri de caractere puteți:

  1. Either assign the result to a string object:

    std::string result = objDim + objDimStr;
    

    (Note the absence of c_str anywhere: you cannot sum two pointers, but there's an overload that can prepend a char pointer to a std::string.)

  2. Or give proper type to objDim;

    std::string objDim{"The object dimension is: "};
    objDim += objDimStr;
    
2
adăugat

objDim is not an std::string but a pointer, so your concatenation operator (+) which is defined for std::string will not work on it.

Definiți-l ca un std :: string și îl veți putea folosi pentru a concatena alte std :: string s.

1
adăugat
@ Xyber101: Apoi puteți face objDimStr + = objDim + objDimStr; . Apoi objDimStr va conține ceea ce aveți nevoie în ordinea corectă.
adăugat autor P.W, sursa
Bine, îmi dau perfect ceea ce spui, un șir va fi atașat doar cu un șir, nu cu un pointer. Dar, am nevoie de o variabilă de caractere *, așa că trebuie să trec la o funcție API pentru a afișa șirul de pe ecran. Semnătura funcției este: int RhinoMessageBox (const char * message, const char * title, tip UINT)?
adăugat autor Xyber 101, sursa
Din nou, asta mi-ar da un șir, nu-i așa? Am nevoie de un caracter * cu datele șirului. Cum trebuie să fac? Ne pare rău, eu sunt un începător în C și acest lucru pointer ma luat destul de legat :(
adăugat autor Xyber 101, sursa

Voi declarați obiecția objDim ca const, ceea ce înseamnă că poate fi NU modificată în timpul executării.

You should either use std::string instead of const char* or use strncat, as seen here: Append to the end of a Char array in C++

1
adăugat
objDim += objDimStr.c_str();

Aici adăugați un pointer la altul în loc să concatenați șirul. Aveți nevoie să utilizați std :: string pentru a concatena, de exemplu:

const char* objDim = "The object dimension is: ";
int objDimension = geo->Dimension();
std::string objDimStr = objDim;
objDimStr += std::to_string(objDimension);
std::cout << objDimStr << std::endl;
0
adăugat

de ce să nu fi objDim să fie std :: string și apoi să utilizați operator + pentru a concatena? în general, un const nu poate fi schimbat, veți avea nevoie de o nouă variabilă pentru a ține concatanarea de la https://msdn.microsoft.com/en-us/library/07x6b05d .aspx :

Când modificați o declarație de date, cuvântul cheie const indică acest lucru   obiectul sau variabila nu poate fi modificată.

0
adăugat
Acest lucru nu răspunde la întrebare, este mai mult un comentariu.
adăugat autor Some programmer dude, sursa