Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  11 2285
Hei! Har nettopp begynt å programmere i C++ og har et spørsmål angående klasser og pekere.

I Java så kan vi skrive følgende:

Kode

class Bil{
    Bil volvo;
}
hvordan blir denne koden i C++?
Eh, er ikke så stø i java. Men, her er et lite eksempelhack som innehodler noen av de tingene du kunne få bruk for.

Kode

#include <cstdio>
#include <iostream>

using namespace std;
typedef double T;

template <typename T>
class jtest {
public:
    static bool testfun(const int x, int *y);
    static bool run();
};


template <typename T>
bool jtest<T>::run()
{
    int x = 1;
    int y = 0;
    if (! testfun(x, &y)){
        cout << "error" << endl;
        return false;
    }
    cout << x << "  " << y << endl;
    return true;
}

template <typename T>
bool jtest<T>::testfun(const int x, int *y)
{
    *y = 2 + x;
    return true;
}

int main (int argc, char *argv[])
{
    jtest<T>::run();
    return 0;
}
Noe som var til hjelp der?
Klassen kan inneholde en peker til sin egen klasse,
så eksempelet ditt blir:

Kode

class Bil{
    Bil *volvo;
}
Jeg er ikke så veldig stødig på C++, så rett meg om jeg tar feil.
Sist endret av Ozma; 28. januar 2013 kl. 21:04.
Sitat av Myoxocephalus Vis innlegg
Eh, er ikke så stø i java. Men, her er et lite eksempelhack som innehodler noen av de tingene du kunne få bruk for.

Kode

#include <cstdio>
#include <iostream>

using namespace std;
typedef double T;

template <typename T>
class jtest {
public:
    static bool testfun(const int x, int *y);
    static bool run();
};


template <typename T>
bool jtest<T>::run()
{
    int x = 1;
    int y = 0;
    if (! testfun(x, &y)){
        cout << "error" << endl;
        return false;
    }
    cout << x << "  " << y << endl;
    return true;
}

template <typename T>
bool jtest<T>::testfun(const int x, int *y)
{
    *y = 2 + x;
    return true;
}

int main (int argc, char *argv[])
{
    jtest<T>::run();
    return 0;
}
Noe som var til hjelp der?
Vis hele sitatet...
Skjønner ikke helt hvorfor du drar inn et et avansert(og uoversiktlig) C++ kodeeksempel når du prøver å hjelpe her. Om ikke annet blir bare forvirring skapt i mine øyne.

Kode

#include <iostream>
using namespace std;

class Bil
{
private:
	Bil *Volvo();
};
void main () 
{
	cout << "Random tekst";
}
I C++ har du private, protected og public data. Du må og lese på arv når det kommer til klasser.
Private data har KUN klassen tilgang til.
Protected har klassen, og underklassen(NB, altså kun barnet under).
Public, så har hele koden tilgang.

Kode

#include <iostream>
using namespace std;

class List
{
private:
        int verdi;
	List *Neste_på_listen();
};
void main () 
{
	cout << "Random tekst";
}
Kanskje denne er litt lettere å skjønne når jeg bruker navnet list?
Du kan lage en liste med denne klassen, via da av at en klasse, peker på neste klasse

Pekere er også noe du bør lese deg opp på.
Sist endret av hurdur; 28. januar 2013 kl. 22:22.
Sitat av hurdur Vis innlegg
Skjønner ikke helt hvorfor du drar inn et et avansert(og uoversiktlig) C++ kodeeksempel når du prøver å hjelpe her. Om ikke annet blir bare forvirring skapt i mine øyne.
Vis hele sitatet...
Tja, jeg lagde den der for meg selv mens jeg drev og lærte meg dette, og en kompis av meg sa den var nyttig da han holdt på med det samme. Klar over at det var litt overflødig informasjon der med templates osv., men det er jo slikt man får bruk for senere uansett?

Men, på hvilken måte er koden uoversiktlig? Her spør jeg av genuin interesse; jeg vil gjerne skrive ryddig kode, og hvis den oppfattes som uoversiktlig har jeg tydeligvis mislykket. Ser jo at main kanskje ser ut som en ettertanke (hvilket den er, men jeg sydde to filer sammen til en før jeg posta). Hvordan ville du ha gjort det?
Det var spesielt den ene funksjonen som plaget meg!

bool jtest<T>::testfun(const int x, int *y)
{
*y = 2 + x;
return true;
}
Den returner jo true uansett, hva er poenget med den? Er det simpelten kun for å sjekke at den klarte å utføre matematikken?
Litt off topic, men kan anbefalle denne youtube videoen om pekere, med Richard Buckland. Veldig bra forelesning hvis forståelsen med pekere ikke er helt på plass

http://www.youtube.com/watch?v=Rxvv9krECNw
Sitat av hurdur Vis innlegg
Det var spesielt den ene funksjonen som plaget meg!

bool jtest<T>::testfun(const int x, int *y)
{
*y = 2 + x;
return true;
}
Den returner jo true uansett, hva er poenget med den? Er det simpelten kun for å sjekke at den klarte å utføre matematikken?
Vis hele sitatet...
Ah, ja, jeg burde vel i pedagogikkens navn ha slengt ved en exception. Si at vi vil ha en positiv verdi på y eller noe, da kan vi heller definere funksjonen slik

Kode

bool jtest<T>::testfun(const int x, int *y) 
{ 
    *y = 2 + x; 
    if (*y < 0)
        return false;
    return true; 
}
Poenget er at verdiene dine settes via pekere, akkurat som om du bruker void, mens selve funksjonen returnerer true eller false avhengig av om den lykkes eller ikke. Dette kan, kombinert med feilmeldinger i tilfelle den returenerer false, gjøre det mye lettere å finne ut hva som tryner og hvorfor.

Det er en måte å programmere på som veilederen min forfekter, og jeg gjør det stort sett slik.
Sitat av Myoxocephalus Vis innlegg

Kode

    if (*y < 0)
        return false;
    return true;
Vis hele sitatet...
lolwat.

return *y < 0;
Sitat av alexanderb Vis innlegg
lolwat.

return *y < 0;
Vis hele sitatet...
Nå, jeg er klar over at eksempelet mitt var oversimplifisert, og at man derfor kan ta en snarvei som dette. Jeg ønsket å vise strukturen, ikke gjøre det på færrest mulig linjer - normalt gidder man ikke akkurat ty til templates og klasser for å avgjøre om et 2+x er større enn null...

Men, hvis du først skal komme med en lolwhat, så får du i det minste kode riktig: siden du vil returnere false hvis 2+x < 0, så skulle du heller ha skrevet
return *y > 0;
i steden...
leste feil, ja. men å bruke tre linjer på noe som bør være et utsagn gjør det litt slitsomt å lese. kunne sikkert brukt tredve linjer "for å illustrere" om du ville, men det er en farlig vei å gå. mange programmeringslærere gjør dette, og ender opp med å lære bort stygge og meningsløse vaner.
Sitat av alexanderb Vis innlegg
leste feil, ja. men å bruke tre linjer på noe som bør være et utsagn gjør det litt slitsomt å lese. kunne sikkert brukt tredve linjer "for å illustrere" om du ville, men det er en farlig vei å gå. mange programmeringslærere gjør dette, og ender opp med å lære bort stygge og meningsløse vaner.
Vis hele sitatet...
Hm, ja. Jeg hater å innrømme det, men du har helt rett. Satt nettopp og formulerte et tilsvar der jeg ville legge ved flere error-exceptions osv., osv, men du har helt klart et poeng. Beklager det.