[C++] klasse oproep

Pagina: 1
Acties:

  • mandroid
  • Registratie: Juli 2002
  • Laatst online: 01-02 07:50
Tot nu toe hebben we steeds C geleerd, maar nu kregen we een opdracht die we in C++ moetsen schrijven.
Voor deze opdracht moeten we een klasse Beeld schrijven waarmee we een bmp omzetten naar een matrix van pixels.

De klasse heb ik reeds volledig gedefinieerd, ik sukkel enkel nog met de klasse oproep. De constructor heeft de vorm
code:
1
 Beeld(std::string& str)


Mn vraag is nu hoe moet ik deze oproepen ?

code:
1
2
3
4
5
string a( "bits24.bmp" );
Beeld beeld1(a); //werkt niet
Beeld beeld2(&a); //werkt ook niet
Beeld* test = new Beeld(a); //dit werkt wel maar dit is een pointer naar die klasse wat ik dus niet nodig heb
Beeld beeld3 = new Beeld(a); //dit kan al helemaal niet


iemand een idee hoe ik dit nu wel moet oproepen ?

ook zou ik ook graag es weten waar
code:
1
string& a

precies voor staat, is dit een pointer zoals in C of is het wat anders ?

Verwijderd

code:
1
2
Beeld* test = new Beeld(a); 
//dit werkt wel maar dit is een pointer naar die klasse wat ik dus niet nodig heb
Dit is natuurlijk wel de gebruikelijke manier, zodat je kan doen:

code:
1
2
Beeld * AutoPlaatje = new Beeld("ferrari.bmp");
Beeld * FietsPlaatje = new Beeld("dawson.bmp");


Een functie aanroepen van een class zonder hem te instantieren gaat in Java met het keyword static, het zou me niet verbazen als dat in C++ ook zo was.

Door de constructor aan te roepen met new Beeld maak je automatisch een instantie. Je zou een static functie werk moeten maken ofzo, en dan Beeld::werk("goatse.bmp") moeten aanroepen, vermoed ik.

Hier staat er iets meer over. Bedenk wel dat het gebruik van static functies niet echt object-oriented is.

[ Voor 31% gewijzigd door Verwijderd op 02-04-2004 21:56 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

lord-evil schreef op 02 april 2004 @ 21:38:
De klasse heb ik reeds volledig gedefinieerd, ik sukkel enkel nog met de klasse oproep. De constructor heeft de vorm
code:
1
 Beeld(std::string& str)
Is een beetje vreemd, dit zou logischer zijn:
code:
1
 Beeld(const std::string& str)
Mn vraag is nu hoe moet ik deze oproepen ?

code:
1
2
3
4
5
string a( "bits24.bmp" );
Beeld beeld1(a); //werkt niet
Beeld beeld2(&a); //werkt ook niet
Beeld* test = new Beeld(a);
Beeld beeld3 = new Beeld(a); //dit kan al helemaal niet
Wat dacht je van:
C++:
1
Beeld MijnBeeld("bits24.bmp");

:?

En je eerst voorbeeld hoort ook te werken (beeld1 dus), daarmee maak je 'm op de stack aan.
code:
1
string& a

precies voor staat, is dit een pointer zoals in C of is het wat anders ?
Daarvoor moet je echt even je boek nakijken hoor, da's C++ beginnerswerk :)

Om precies te zijn is het een reference, zoek maar op ;)

[ Voor 4% gewijzigd door curry684 op 02-04-2004 21:58 ]

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 02 april 2004 @ 21:53:
Hier staat er iets meer over. Bedenk wel dat het gebruik van static functies niet echt object-oriented is.
Da's onzin, indien correct toegepast is gebruik van static functies juist heel erg object-oriented :)

Professionele website nodig?


  • mmedia
  • Registratie: Januari 2002
  • Laatst online: 17-12-2021
curry684 schreef op 02 april 2004 @ 21:57:
[...]

Daarvoor moet je echt even je boek nakijken hoor, da's C++ beginnerswerk :)

Om precies te zijn is het een reference, zoek maar op ;)
Jep, je kunt een argument by value meegeven of by reference en ja dit is een essentieel verschil. Zou ik ook maar even opzoeken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op 02 april 2004 @ 21:53:
Door de constructor aan te roepen met new Beeld maak je automatisch een instantie. Je zou een static functie werk moeten maken ofzo, en dan Beeld::werk("goatse.bmp") moeten aanroepen, vermoed ik.
Nee; de constructor is juist. Voor elke .bmp die je processed wil je namelijk een Beeld object aanmaken. Hoe je dat doet hangt van de context af. Het kan zelfs erg impliciet:

code:
1
2
3
void sendToPrinter( Beeld const& beeld );
std::string filename( "mijn_plaatje.bmp" );
sendToPrinter( filename );


De compiler ziet dat je een beeld wil printen, een filename hebt, en hoe je van een string een Beeld maakt. Hier is je Beeld object dus een parameter van een functie, niet een Beeld object wat je zelf expliciet op de stack of heap zet.

[ Voor 10% gewijzigd door MSalters op 03-04-2004 00:18 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • mandroid
  • Registratie: Juli 2002
  • Laatst online: 01-02 07:50
curry684 schreef op 02 april 2004 @ 21:57:

En je eerst voorbeeld hoort ook te werken (beeld1 dus), daarmee maak je 'm op de stack aan.
daarmee krijg ik twee errors:
code:
1
2
3
Linking...
LINK : error LNK2020: unresolved token (0A000047) Beeld.__dtor
LINK : fatal error LNK1120: 1 unresolved externals


:?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-05 22:35

Creepy

Tactical Espionage Splatterer

lord-evil schreef op 03 april 2004 @ 10:10:
[...]


daarmee krijg ik twee errors:
code:
1
2
3
Linking...
LINK : error LNK2020: unresolved token (0A000047) Beeld.__dtor
LINK : fatal error LNK1120: 1 unresolved externals


:?
Je hebt naast de constructor ook een destructor aangemaakt (~Beeld)?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • mandroid
  • Registratie: Juli 2002
  • Laatst online: 01-02 07:50
Creepy schreef op 03 april 2004 @ 11:04:
[...]

Je hebt naast de constructor ook een destructor aangemaakt (~Beeld)?
Ik had die wel al in Beeld.h maar niet in Beeld.cpp

en nu werkt het !!
thx

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-05 22:35

Creepy

Tactical Espionage Splatterer

lord-evil schreef op 03 april 2004 @ 11:45:
[...]


Ik had die wel al in Beeld.h maar niet in Beeld.cpp

en nu werkt het !!
thx
Heb je ook enig idee waarom? :)

Als je een object aanmaakt met new zul je er zelf voor moeten zorgen dat je het object ook weer verwijdert. Op dat moment wordt de destructor aangeroepen.
Op het moment dat je het classe direct instantieert en toekent aan een variabele zal de compiler zelf automatisch de destructor aanroepen op het moment dat die variabele buiten de scope gaat.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens ben ik wel benieuwd naar de error van
C++:
1
2
string a( "bits24.bmp" );
Beeld beeld1(a); //werkt niet


Want dat zou gewoon moeten werken (of is die link error gewoon de error die je kreeg?)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mandroid
  • Registratie: Juli 2002
  • Laatst online: 01-02 07:50
.oisyn schreef op 03 april 2004 @ 16:30:
Overigens ben ik wel benieuwd naar de error van
C++:
1
2
string a( "bits24.bmp" );
Beeld beeld1(a); //werkt niet


Want dat zou gewoon moeten werken (of is die link error gewoon de error die je kreeg?)
ja het is zijn die twee link errors, gewoon compilen werktte nog, maar linken was er teveel aan.
Pagina: 1