|
| String ikke indlæst - detektering af null ~ Fra : Trygleren [9000] |
Dato : 22-11-02 20:20 |
|
Hej,
jeg prøver at lære C++, men er løbet ind i en væg. Hvordan tjekker man for
en nullpointer? Dvs. i javaforstand. Hvis jeg opretter en String i java og
ikke tildeler den en værdi, kan jeg teste om den er null. Hvorledes gør man
dette i C++?
Eks.
//kode start
void main()
{
string a, b;
cout << "StringComparator" << endl;
while(a==0)
{
cout << "Indtast foerste streng til sammenligning: ";
cin >> a;
}
while(b==0)
{
cout << "Indtast den anden streng til sammenligning: ";
cin >> b;
}
if(a==b)
cout << "Strengene "+a+" og "+b+" er ens.";
else
cout << "Strengene er ikke ens.");
}
//kode slut
--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther
www.hesteskelet.dk
| |
Michael Bülow Jensen (22-11-2002)
| Kommentar Fra : Michael Bülow Jensen |
Dato : 22-11-02 20:37 |
|
"Trygleren [9000]" <TryglerenSLETDETHER@hesteskelet.dk> wrote in message
news:3dde8366$0$140$edfadb0f@dread12.news.tele.dk...
> Hej,
> jeg prøver at lære C++, men er løbet ind i en væg. Hvordan tjekker man for
> en nullpointer? Dvs. i javaforstand. Hvis jeg opretter en String i java og
> ikke tildeler den en værdi, kan jeg teste om den er null. Hvorledes gør
man
> dette i C++?
>
> Eks.
> //kode start
> void main()
> {
> string a, b;
>
> cout << "StringComparator" << endl;
>
> while(a==0)
> {
> cout << "Indtast foerste streng til sammenligning: ";
> cin >> a;
> }
> while(b==0)
> {
> cout << "Indtast den anden streng til sammenligning: ";
> cin >> b;
> }
>
> if(a==b)
> cout << "Strengene "+a+" og "+b+" er ens.";
> else
> cout << "Strengene er ikke ens.");
> }
> //kode slut
//Kode start
#include <string>
int main()
{
std::string a, b;
std::cout << "StringComparator" << std::endl;
while(a.empty())
{
std::cout << "Indtast foerste streng til sammenligning: ";
std::cin >> a;
}
while(b.empty())
{
std::cout << "Indtast den anden streng til sammenligning: ";
std::cin >> b;
}
if(a == b)
std::cout << "Strengene " << a << " og " << b << " er ens.";
else
std::cout << "Strengene er ikke ens.";
}
//Kode slut
| |
Trygleren [9000] (23-11-2002)
| Kommentar Fra : Trygleren [9000] |
Dato : 23-11-02 00:01 |
|
> while(a.empty())
Det går fint for strings, men jeg taler generelt. I java ( undskyld =) ) kan
man tjekke for null på næsten alle typer.
Eks.
if(minVector==null)
eller
if(minInt==null)
osv.
Er der ikke en sådan mulighed i C++?
--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther
www.hesteskelet.dk
| |
Ivan Johansen (23-11-2002)
| Kommentar Fra : Ivan Johansen |
Dato : 23-11-02 01:03 |
|
Trygleren [9000] wrote:
> Det går fint for strings, men jeg taler generelt. I java ( undskyld =) ) kan
> man tjekke for null på næsten alle typer.
> Eks.
> if(minVector==null)
>
> eller
>
> if(minInt==null)
>
> osv.
>
> Er der ikke en sådan mulighed i C++?
Det er fordi næsten alting i Java er pointere (hvilket kaldes referencer
i Java). Du kan gøre det samme i C++ hvis du bruger pointere, hvilket du
bør undgå hvis det ikke er nødvendigt.
void f(int *minInt)
{
if(minInt == NULL)
{
}
}
Men husk at unødig brug af pointere giver problemer. C++ har ikke
automatisk tjek af pointere som Java har.
Ivan Johansen
| |
Morten Brix Pedersen (23-11-2002)
| Kommentar Fra : Morten Brix Pedersen |
Dato : 23-11-02 01:19 |
|
Ivan Johansen wrote:
> Det er fordi næsten alting i Java er pointere (hvilket kaldes referencer
> i Java). Du kan gøre det samme i C++ hvis du bruger pointere, hvilket du
> bør undgå hvis det ikke er nødvendigt.
>
> void f(int *minInt)
> {
> if(minInt == NULL)
Det skal lige nævnes, at mange C++ folk (blandt andet Bjarne Stroustrup)
mener at man bør bruge 0 istedet for NULL.
--
- Morten.
| |
Mogens Hansen (23-11-2002)
| Kommentar Fra : Mogens Hansen |
Dato : 23-11-02 11:34 |
|
"Trygleren [9000]" <TryglerenSLETDETHER@hesteskelet.dk> wrote in message
news:3dde8366$0$140$edfadb0f@dread12.news.tele.dk...
> Hvis jeg opretter en String i java og
> ikke tildeler den en værdi, kan jeg teste om den er null.
Her skal man lige være omhyggelig med ordvalget.
Når man i Java skriver:
String s;
opretter man _ikke_ et String objekt.
Det gælder f.eks. at der _ikke_ er kaldt nogen constructor.
Man har kun oprettet en reference, som er initialiseret til null.
Sådan forholder det sig for alle ikke simple typer (altså ikke int etc.).
Når man i C++ skriver
std::string s;
opretter man et std::string objekt.
Det vil sige at kalder default constructoren, som initialiserer s til
værdien for den tomme streng.
Sådan forholder det sig for alle typer (såfremt de har en default
constructor).
Når man i Java skriver:
String s = "Hello world!";
får man særlig hjælp fra compileren, som omskriver det til
String s = new String("Hello world!");
hvor der altså både bliver oprettet en reference til et String objekt og et
String objekt med værdien "Hello world!".
Det er specielt for String typen.
Når man i C++ skriver:
std::string s = "Hello world!"
opretter man et std::string objekt som har værdien "Hello world!", fordi der
bliver kaldt en constructor som tager en "const char*" som argument.
> Hvorledes gør
man
> dette i C++?
Jeg syntes at man i denne sammenhæng kan have glæde af at erkende at
objekter generelt har 3 aspekter:
* værdi (state)
* opførsel
* identitet
hvor de 3 aspekter vejer forskelligt afhængig af objekt typen.
F.eks. vil et bank-konto objekt have en kraftig _identitet_; selvom 2 konti
har samme saldo, er det bestemt ikke lige meget om man bruger den ene eller
den anden.
Objekter af typer med kraftig identitet kan f.eks. typisk ikke kopieres.
Et eksempel på objekter, hvor opførslen er vigtig er funktion-objekter.
F.eks. alle typer i C++ standard biblioteket, der arver fra
"std::unary_function".
Objekter som f.eks. int og std::string er domineret af deres _værdi_. Det
spiller ikke den store rolle om vi bruger den ene eller den anden integer,
men det er væsentligt hvilken værdi den har.
Sådanne objekter kan typisk kopieres, og det vil blive gjort i flæng, uden
man tænker meget over det.
En dato-klasse (som ikke er del af C++ standard biblioteket) er også et
eksempel på et værdi objekt.
Med den viden om at std::string er en værdi-type, må man forvente at den på
mange måder opfører sig som en integer.
Man kan f.eks. sammenligne værdier.
Det jeg opfatter du vil, er at vide hvornår _værdien_ af objektet er
forskellig fra _værdien_ af den tomme streng.
Altså
std::string a;
while(a == "")
Hvis man bruger member-funktionen std::string::empty, hvilket man sagtens
kan, opfatter man i højere grad string objektet som en container end som en
værdi.
Dit program bliver altså:
#include <string>
#include <iostream>
int main()
{
using std::string;
using std::cout; using std::endl;
using std::cin;
cout << "String comparator" << endl;
string a;
while("" == a) {
cout << "Enter first string:" << endl;
cin >> a;
}
string b;
while("" == b) {
cout << "Enter second string:" << endl;
cin >> b;
}
cout << (a == b ?
"The strings have the same value" :
"The strings have different value") << endl;
}
[8<8<8<]
> void main()
main returnerer _altid_ int
Venlig hilsen
Mogens Hansen
| |
Trygleren [9000] (23-11-2002)
| Kommentar Fra : Trygleren [9000] |
Dato : 23-11-02 15:39 |
|
> Jeg syntes at man i denne sammenhæng kan have glæde af at erkende at
> objekter generelt har 3 aspekter:
> * værdi (state)
> * opførsel
> * identitet
>
> hvor de 3 aspekter vejer forskelligt afhængig af objekt typen.
<SNIP>
Tak for et særdeles fyldestgørende svar. Det hjælper altid utroligt godt med
hvad der sker under overfladen, før man begiver sig videre op ad.
> Altså
> std::string a;
>
> while(a == "")
<SNIP>
Selvfølgelig (*mumler for sig selv*: stupid stupid stupid)
> > void main()
>
> main returnerer _altid_ int
Det ved jeg godt, men mit program virkede ikke ordentligt.
Så må man jo prøve sig frem med forskellige ændringer. Det er nybegynderens
lod =)
--
"Sic gorgiamus allos subjectatos nunc"
Lars 'Trygleren' Winther
www.hesteskelet.dk
| |
|
|