[C++] Variabelen over verschillende klassen gebruiken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Thierryziezo
  • Registratie: Oktober 2003
  • Niet online
Hallo,

Sinds een kleine 3 weken ben ik C++ gaan leren. Momenteel probeer ik een GUI werkend te krijgen.

Het is me echter niet geheel duidelijk hoe variabelen die in een klasse gedeclareerd en gemanipuleerd worden, kunnen worden opgevraagd in een andere klasse.

Concreet in mijn geval: ik heb een variabele die een maximum bijhoudt. Wanneer ik die in een hoofdklasse definieer, hoe kan ik die dan bereiken vanuit andere klassen? Get/set heeft volgens mij weinig zin, aangezien je geen objecten van die variabele kan oproepen.

Iemand die mij kan helpen? Hartelijk dank!

[ Voor 9% gewijzigd door Thierryziezo op 25-10-2011 10:25 ]

Asus Mainboard - Intel Pentium III 1 GHz - 512 MB SD-RAM - 2*80 GB Maxtor HDD - Toshiba DVD 16/48 - Plextor Plexwriter 48/24/48A - Acer AL511 TFT-monitor - Standaard keyboard - Logitech MX-300 mouse


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Alhoewel ik geen ervaring met C++ heb, heb ik wel ervaring met andere oop talen

Om vaste variabelen te kunnen gebruiken, maak je gebruik van constantes of statische variabelen. Deze kunnen dus niet geïnitialiseerd worden, maar dit wordt automagisch gedaan wanneer de klasse opgevraagd wordt. In C++ is dit ook mogelijk, en zou je op deze manier kunnen doen.

Let er wel op dat statische variabelen en functies in een gedeeld geheugen staan. Wanneer deze dus worden overschreven, dan is deze variabele of functie in alle andere klassen waar dit gebruikt wordt ook overschreven.

Overigens kan ik mijzelf niet voorstellen dat je geen voorbeelden bij deze opdracht gekregen hebt.

Acties:
  • 0 Henk 'm!

  • danielkraak
  • Registratie: Juli 2006
  • Laatst online: 20-09 17:52
Ik ben ook net begonnen met C++ en de enige oplossing die ik kan bedenken is een pointer meegeven aan de constructor van je klasse naar het object waarvan jij de variabelen nodig hebt. Dan moet je natuurlijk ook bij de klasse die het object nodig heeft een member aanmaken die wijst naar het object. Op die manier kun je bij de variabelen van het object.

Ik hoop dat ik een beetje duidelijk ben... En ik hoop eigenlijk ook te horen van iemand anders dat het makkelijker kan (en dan niet met globale variabelen).

Acties:
  • 0 Henk 'm!

  • Thierryziezo
  • Registratie: Oktober 2003
  • Niet online
Toch zijn er geen voorbeelden in de aard van wat ik nodig heb:). Ik probeerde daarnet door naast de headerfile, waar ik mijn variabele declareer, ook de cpp-file te includen. Dan herkent de nieuwe klasse mijn variabele wél, maar krijg ik overal errors als "error LNK2005: "int maxCoord" (?maxCoord@@3HA) already defined in hw4_1.obj".

Ik denk niet dat het de bedoeling is om dit zo aan te pakken.

Asus Mainboard - Intel Pentium III 1 GHz - 512 MB SD-RAM - 2*80 GB Maxtor HDD - Toshiba DVD 16/48 - Plextor Plexwriter 48/24/48A - Acer AL511 TFT-monitor - Standaard keyboard - Logitech MX-300 mouse


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

die linker error betekent in 99% van de gevallen dat je een static variabele hebt in een header file. static variabelen is waarschijnlijk niet wat je wilt hebben gezien je OOP aan het leren bent. zoek eens op wat OOP inhoud, en dan voornamelijk hoe je objecten instantieert (ik denk dat je dat niet gedaan hebt, en daarom niet bij je variabelen kan).

simpel voorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class foo
{
  int bar;
public:
  foo() : bar(0) {}
  void set_bar(int x) { bar = x; }
  int get_bar() const { return bar; }
};

int main()
{
  //stack instantie
  foo f;
  f.set_bar(0);

  //heap instantie
  foo *instance = new foo();
  instance->set_bar(42);
  delete instance;

  return 0;
}

[ Voor 6% gewijzigd door MLM op 23-10-2011 21:23 ]

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien moet je even een relevant stukje van je code posten (gaarne met gebruik van code-tags, zodat het nog enigszins leesbaar is) -- dan is het wellicht iets duidelijker wat je nu probeert te bereiken, en waar dat fout gaat. :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Thierryziezo schreef op zondag 23 oktober 2011 @ 21:13:
Toch zijn er geen voorbeelden in de aard van wat ik nodig heb:). Ik probeerde daarnet door naast de headerfile, waar ik mijn variabele declareer, ook de cpp-file te includen. Dan herkent de nieuwe klasse mijn variabele wél, maar krijg ik overal errors als "error LNK2005: "int maxCoord" (?maxCoord@@3HA) already defined in hw4_1.obj".
Waarschijnlijk definieer je je variabelen ipv ze te declareren.

C++:
1
2
extern int myVar; // declaratie. "Er bestaat een myVar van het type int"
int myVar; // definitie. "Hier is myVar van het type int"

De declaratie moet in de header staan om aan sourcefiles duidelijk te maken dat myVar bestaat en wat het type is. Maar omdat de variabele ook ergens moet leven, is een definitie ook ergens nodig, typisch in de sourcefile die correspondeert met de header. Op het moment dat je de defintie in de header zet, krijgt elke sourcefile die die header includet natuurlijk zijn eigen definitie van de variabele, wat resulteert in de link errors die je krijgt.

[ Voor 8% gewijzigd door .oisyn op 24-10-2011 23:11 ]

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.


Acties:
  • 0 Henk 'm!

Verwijderd

Vreemd, ik lees het probleem van de TS simpelweg als: hoe kan Class A een variabele van Class B uitlezen?

(Of wellicht, vanwege de term 'hoofdklasse': hoe leest een afgeleide class een (private) variabele van een superclass?)

Met andere woorden, is deze opdracht niet gewoon een les in OOP, zonder static en extern en dergelijke?

Acties:
  • 0 Henk 'm!

  • Thierryziezo
  • Registratie: Oktober 2003
  • Niet online
Het doel is een kleine MFC-toepassing te ontwikkelen die punten tekent en vervolgens de afstanden tussen de punten beschouwt. De Doc-klasse genereert de punten en houdt x[i] en y[i] bij, de coördinaten van de 1..nmPoints punten. In de View-klasse moet de informatie uit de Doc-klasse visueel gemaakt worden (onder de vorm van punten of ellipsen). Hiervoor moeten die coördinaten uit de Doc-klasse uitgelezen kunnen worden.

Daar schuilt het probleem: het lukt me niet om die waarden uit te lezen. Ik dacht
C++:
1
this->getDocument()->x[ i ] 
te kunnen gebruiken om deze coördinaten uit te lezen, maar dit blijkt niet te lukken. Wellicht gebruik ik een verkeerde manier voor het oproepen van de waarden, al is het me niet onmiddellijk duidelijk wat de correcte manier is.

In de Doc.cpp-file heb ik dus
C++:
1
2
3
void CtaakDoc::initPoints(){ 
...
}
om de coördinaten van punten te genereren en in de Doc.h-file heb ik onder meer
C++:
1
2
3
4
 
public:
double *x, *y; 
double nmPoints;

staan, wat zou moeten volstaan om de gegevens op te roepen, dacht ik.

Hopelijk is dit wat duidelijker. Alvast bedankt!

[ Voor 7% gewijzigd door Thierryziezo op 25-10-2011 10:24 ]

Asus Mainboard - Intel Pentium III 1 GHz - 512 MB SD-RAM - 2*80 GB Maxtor HDD - Toshiba DVD 16/48 - Plextor Plexwriter 48/24/48A - Acer AL511 TFT-monitor - Standaard keyboard - Logitech MX-300 mouse


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:35
Lees Hier over het koppelen van objecten in software.
Onder solutions staan een aantal voorbeelden van de verschillende typen "coupling".

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Volgens msdn geeft GetDocument() een CDocument pointer. Die heeft geen x member.

Als je dus bij die x wilt komen, zou je kunnen doen:
C++:
1
static_cast<CtaakDoc *>(this->GetDocument())->x[ i ]
Pagina: 1