[C++]Random name voor een object?

Pagina: 1
Acties:

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Ik heb een class aangemaakt met de naam project. Van de class project heb je notities en een deadline. Als ik een nieuw project aan wil maken gebruik ik de standaard code:
code:
1
Project PJ("notities","Deadline")

Die voeg je dan toe aan de vector.
MAAR de gebruiker moet de mogelijkheid hebben om zoveel mogelijk projecten aan te maken als hij zelf wil. Het liefst zou ik dan willen zien dat de naam van een nieuw project een getal is. Bijvoorbeeld:
code:
1
2
for (i = 0; i < 10; i++) 
Project I("Notities","Deadline");

Is het mogelijk mijn code zo te maken dat i niet de naam is van het project maar de inhoud van de int i?

Of denk ik nu op de verkeerde manier?

http://hawvie.deviantart.com/


  • Count
  • Registratie: Augustus 2000
  • Laatst online: 10-08-2023
Op maandag 10 juni 2002 11:01 schreef HawVer het volgende:
Ik heb een class aangemaakt met de naam project. Van de class project heb je notities en een deadline. Als ik een nieuw project aan wil maken gebruik ik de standaard code:
code:
1
Project PJ("notities","Deadline")

Die voeg je dan toe aan de vector.
MAAR de gebruiker moet de mogelijkheid hebben om zoveel mogelijk projecten aan te maken als hij zelf wil. Het liefst zou ik dan willen zien dat de naam van een nieuw project een getal is. Bijvoorbeeld:
code:
1
2
for (i = 0; i < 10; i++) 
Project I("Notities","Deadline");

Is het mogelijk mijn code zo te maken dat i niet de naam is van het project maar de inhoud van de int i?

Of denk ik nu op de verkeerde manier?
Je bedoeld dat je dan dit krijgt:
Project I("Notities1","Deadline1");
Project I("Notities2","Deadline2");
etc?

Dit is vrij simpel te doen:
code:
1
2
3
4
5
6
7
8
9
#include <stdio.h>

for(int i = 0; i < aantalProjecten; i++){
    char notities[512], deadline[512];
    sprintf(notities, "Notities%d", i);
    sprintf(deadline, "Deadline%d", i);
    
    vector.push_back(Project(notities, deadline));
}

Great minds think in parallel gutters.


  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Ik bedoel op deze manier:

Je maakt een nieuw project aan. i is dan bijvoorbeeld 1. De naam van het nieuwe project is dan niet i maar 1. Later kan ik het project weer aan roepen door 1.GetNaam aan te roepen.

Het probleem is eigenlijk dat de gebruiker meerdere projecten moet aan kunnen maken. Hoe houd ik daar nu de controlle op?

http://hawvie.deviantart.com/


  • General_Failure
  • Registratie: Oktober 2000
  • Laatst online: 02-09 15:46

General_Failure

Vrolijk Pasen!!!

De naam van een project is een identifier. Een identifier kan nooit met een getal beginnen.
Je zult er dus een string voor moeten plakken, zodat je bijvoorbeeld Project1.GetNaam zult krijgen.

Me and my dear friend General Protection-Error will invade your computer with our mighty army of Bugs. We will avoid the Firewall at the Gates of your PC by entering through your Windows.


  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Ik heb volgens mij wel door wat je wil (heb ik ook zo vaak :P). Je wilt gewoon dat de inhoud van een variabele de naam van de variabele is. Dus als volgt:
code:
1
2
3
4
5
for(i = 0; i < 10; i++)
{
  Project i("notities", "deadline");
  cout << i.getNotities() << endl; //oid
}

Maar hoe?!? :? Ik zou het werkelijk niet weten, maar wel graag willen weten!

Used to be Down Under... Foto gallery


  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Jij snapt mij :Y) Dat is precies wat ik bedoel.

http://hawvie.deviantart.com/


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Sorry dat ik het zeg, maar dit is natuurlijk wel een beetje ranzig. Waarom moet de variabele dan nog een variabele naam hebben??

Variabele variabelen zijn eigenlijk altijd overbodig en zijn makkelijk af te vangen mbv arrays..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Dikkie
  • Registratie: Oktober 2000
  • Laatst online: 12:08
kan dat niet met new, oftewel dynamisch geheugen?

Verwijderd

Ik denk dat je hiervoor hashtables wilt gebruiken... variable variables bestaan volgens mij niet echt in c++

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op maandag 10 juni 2002 11:54 schreef tijnbraun het volgende:
Ik denk dat je hiervoor hashtables wilt gebruiken... variable variables bestaan volgens mij niet echt in c++
En terecht :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Op maandag schreef Janoz:
Sorry dat ik het zeg, maar dit is natuurlijk wel een beetje ranzig. Waarom moet de variabele dan nog een variabele naam hebben??

Variabele variabelen zijn eigenlijk altijd overbodig en zijn makkelijk af te vangen mbv arrays..
Tja maar het is wel verrekte handig. Hoe zou ik dat met een array op kunnen lossen?

http://hawvie.deviantart.com/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op maandag 10 juni 2002 12:11 schreef HawVer het volgende:

[..]

Tja maar het is wel verrekte handig. Hoe zou ik dat met een array op kunnen lossen?
code:
1
2
3
4
5
#include <vector>
std::vector<Project> vp;
vp.push_back( Project("project0") ); 
// Check sprintf methode uit eerdere reply
vp[0].member_van_Project();

De array_naam[index] ( vp[0] ) notatie gebruik je om members van een array/vector te benoemen. push_back is nodig omdat de vector leeg begint.

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


  • Dikkie
  • Registratie: Oktober 2000
  • Laatst online: 12:08
ik heb ff wat geknoeid. Ben geen super programmeur :P

Als er op de knop geklikt wordt, dan maakt ie een nieuw Project object aan. Die pleurt ie weer achterin de vector.
code:
1
2
3
4
5
6
7
vector<Project> project_vector;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Project *new_project = new Project("notities","Deadline");
project_vector.push_back(*new_project);

}

tis btw gedaan in Borland c++ builder 6.

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Ik zie het al helemaal voor me.. Als het me gelukt is zal ik even mijn oplossing geven. Thnx :)

http://hawvie.deviantart.com/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op maandag 10 juni 2002 12:24 schreef dikkiedik het volgende:
ik heb ff wat geknoeid. Ben geen super programmeur :P
code:
1
2
3
4
5
6
7
vector<Project> project_vector;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Project *new_project = new Project("notities","Deadline");
project_vector.push_back(*new_project);

}
Moet zijn:
code:
1
2
Project new_project ("notities","Deadline");
project_vector.push_back(new_project);

anders lek je new_project.

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


  • Dikkie
  • Registratie: Oktober 2000
  • Laatst online: 12:08
hmm, is inderdaad ook een mogelijkheid.

Maar als je de destructor in Project aanpast moet het toch ook kunnen?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op maandag 10 juni 2002 15:38 schreef dikkiedik het volgende:
hmm, is inderdaad ook een mogelijkheid.

Maar als je de destructor in Project aanpast moet het toch ook kunnen?
Nee; het probleem is nou net dat die dtor niet wordt aangeroepen. Dan kun je erin zetten wat je wil, maar 't gaat niet helpen.

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


Verwijderd

jullie denken allemaal veeeeel te moeilijk...
vectors... heb ze nog nooit gebuikt...

neem gewoon een array:

Project myproject[99];
for(int n = 0; n < 99; n++)
{
myproject[n] = new Project(...); //hier dus de juiste parameters invullen
}

zo is het het klaar...
het enige nadeel is dat de grootte van de array een constante moet zijn. dus zoiets kan niet:
int size = 99;
Project myproject[size];

als je dat wel wil, kan je het beste pointers gebruiken, dan krijg je zoiets:

int size = 99;
Project **myproject;

myproject = GlobalAlloc(GMEM_ZEROINIT, size * 4) //je moet wel geheugen alloceren, een pointer is 4 bytes, dus het aantal projecten * 4 bytes
for(int n = 0; n < size; n++)
{
myproject[n] = new Project(...); je kan hier beter ook die "GlobalAlloc" begruiken
}

vergeet niet dat geheuge ook weer vrij te geven !!
new: delete
GlobalAlloc: GlobalFree

moet je hier maar even mee spelen...
(sorrie voor het niet-inspringen, doet dit forum niet (of ik weet het niet))

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Array is mischien wel makkelijker. Maar als je een erg grote applicatie hebt vreet het geheugen.

http://hawvie.deviantart.com/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op maandag 10 juni 2002 21:05 schreef Jappie het volgende:
jullie denken allemaal veeeeel te moeilijk...
vectors... heb ze nog nooit gebuikt...

neem gewoon een array:

Project myproject[99];
for(int n = 0; n < 99; n++)
{
myproject[n] = new Project(...); //hier dus de juiste parameters invullen
}

zo is het het klaar...
Zo is het Java, zul je bedoelen. 't Is in elk geval geen C++.

PS. vector is simpeler als array. Probeer maar eens in jouw code het aantal gebruikte Projects te vinden. Dan is .size() toch handiger.

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


Verwijderd

Op dinsdag 11 juni 2002 10:13 schreef MSalters het volgende:

Zo is het Java, zul je bedoelen. 't Is in elk geval geen C++.

PS. vector is simpeler als array. Probeer maar eens in jouw code het aantal gebruikte Projects te vinden. Dan is .size() toch handiger.
C++ is die taal waarbij je WEL alles ZELF moet doen...
dus shit als ".size()" is dus JAVA-style !!

om bvb aantal projecten te vinden:

int size;
for(size = 0; myproject[size]; size++);

verder staat in een van de posts hierboven dat array"s geheugen vreten.
DIT IS ABSOLUUT NIET WAAR !!!!
int a; is precies even groot als int x[2];
int b;

maarja... als jullie het allemaal beter weten... zoek het maar uit...

Verwijderd

jappie:
- zet je code tussen code tags, dan kan je wel inspringen...
- int a; is niet precies even groot als int x[2];... je hebt er dan toch 2 ?!?!?

verder heb je helemaal gelijk.

Verwijderd

sorry dat ik zo fel wordt...
maar als iemand mij gaat zeggen dat ik het verschil tussen C++ en JAVA niet weet, wordt ik nogal pissed :-)

Verwijderd

Op dinsdag 11 juni 2002 20:19 schreef unteraarsch het volgende:
jappie:
- zet je code tussen code tags, dan kan je wel inspringen...
- int a; is niet precies even groot als int x[2];... je hebt er dan toch 2 ?!?!?

verder heb je helemaal gelijk.
ik bedoel:
int a;
int b;

is gelijk aan

int x[2];

Verwijderd

Klopt... twee int's zijn even groot als 1 array van 2 int's.
Maar als je nou die projects op een kunstmatige bovengrens gooit van 999 en je hebt nooit meer dan 10 projecten, dan heb je toch ruimte gereserveerd die nooit gebruikt wordt voor 989 projecten.

Dus arrays vreten meer geheugen als je ze slecht gebruikt. En zijn dus eigenlijk niet bedoeld als dynamische structuren, daarom hebben ze ook een vaste bovengrens.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 11 juni 2002 20:20 schreef Jappie het volgende:
sorry dat ik zo fel wordt...
maar als iemand mij gaat zeggen dat ik het verschil tussen C++ en JAVA niet weet, wordt ik nogal pissed :-)
misschien had je dan een array van pointers naar Project moeten declareren ipv een array van gewoon Projecten :z
Op maandag 10 juni 2002 21:05 schreef Jappie het volgende:
Project myproject[99];
for(int n = 0; n < 99; n++)
{
myproject[n] = new Project(...); //hier dus de juiste parameters invullen
}
overigens werkt het in java ook niet zo :)

maar de reden van die opmerking is denk ik dat je code niet echt betuigt van al teveel programmeer-ervaring. Zo stel je bijvoorbeeld voor om GlobalAlloc te gebruiken, wat maar op een paar platformen beschikbaar is (win32), en dat een pointer altijd 4 bytes is (wat dus niet zo hoeft te zijn)

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op dinsdag 11 juni 2002 19:55 schreef Jappie het volgende:

[..]

C++ is die taal waarbij je WEL alles ZELF moet doen...
[SNIP]
om bvb aantal projecten te vinden:

int size;
for(size = 0; myproject[size]; size++);
Kan er iemand deze code uitleggen? Volgens mij heeft Project helemaal geen conversie naar bool, en is de middelste expressie van een for-loop een bool. En
als Project wel een conversie heeft naar bool, dan telt dit het aantal initiele Projects die naar true converteren, niet het totale aantal Projects

( En dan heb ik het nog niet eens over het probleem dat Project niet noodzakelijk een default ctor heeft )

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


  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op woensdag 12 juni 2002 09:55 schreef MSalters het volgende:

[..]

Kan er iemand deze code uitleggen? Volgens mij heeft Project helemaal geen conversie naar bool, en is de middelste expressie van een for-loop een bool. En
als Project wel een conversie heeft naar bool, dan telt dit het aantal initiele Projects die naar true converteren, niet het totale aantal Projects

( En dan heb ik het nog niet eens over het probleem dat Project niet noodzakelijk een default ctor heeft )
Je gebruikt het niet zo zeer als een bool, maar op een manier waarbij als de waarde niet-0 is, de for-loop gewoon doorloopt. Op het moment dat de inhoud 0 is dan is de array afgelopen (iig bij een array van char). Veel gebruikt truukje... In dit geval: als de pointer naar een project 0 is (ofwel niet geinit) dan stopt ie en is dat dus het einde vh array

Used to be Down Under... Foto gallery


Verwijderd

dat is waar... daarom kan je beter met pointers werken...
het nadeel is dat je dan per project 4 bytes extra gealloceerd worden, plus nog 4 bytes voor het groepje.
je moet ook een hoooop zelf doen (vergeleken met zoiets als JAVA).
maarja... die vector gebruikt waarschijnlijk meer geheugen, omdat daar dus allerelei voorgedefineerde dingen bij zitten.

Verwijderd

Op dinsdag 11 juni 2002 21:04 schreef .oisyn het volgende:

[..]

misschien had je dan een array van pointers naar Project moeten declareren ipv een array van gewoon Projecten :z
[..]

overigens werkt het in java ook niet zo :)

maar de reden van die opmerking is denk ik dat je code niet echt betuigt van al teveel programmeer-ervaring. Zo stel je bijvoorbeeld voor om GlobalAlloc te gebruiken, wat maar op een paar platformen beschikbaar is (win32), en dat een pointer altijd 4 bytes is (wat dus niet zo hoeft te zijn)
sorry over de array van pointers naar het Project, je hebt helemaal gelijk :-)

de GlobalAlloc geef ik aan omdat ik zelf veel win-API gebruik, zodat bij overschakeling naar ander OS ook alleen die functies herschreven hoeven worden. verder blijft het editor-onafhankelijk...

en sorry, ging inderdaat van win32 systemen uit...

Verwijderd

Op dinsdag 11 juni 2002 19:55 schreef Jappie het volgende:
C++ is die taal waarbij je WEL alles ZELF moet doen...
dus shit als ".size()" is dus JAVA-style !!
Wie heeft je verteld dat je in C++ alles zelf moet doen? Heb je wel eens de STL bestudeerd? Daarin vind je die member size() voor elk container-type, van vectors tot trees tot lists...
om bvb aantal projecten te vinden:

int size;
for(size = 0; myproject[size]; size++);
Je gaat hier dus een aantal projecten tellen, waarbij je ervan uitgaat dat een leeg project op eoa. manier evalueert tot een false waarde. Doe mij dan maar MyContainer.size()... <edit> De post van MSalters gemist, mosterd na de maaltijd.</edit>
verder staat in een van de posts hierboven dat array"s geheugen vreten.
DIT IS ABSOLUUT NIET WAAR !!!!
int a; is precies even groot als int x[2];
int b;

maarja... als jullie het allemaal beter weten... zoek het maar uit...
Dit is machine-afhankelijk en niet gespecificeerd in de taal. int a; int b; kan best meer ruimte innemen dan int x[2]; hoewel het onwaarschijnlijk is (alignment van variabelen).

Ik denk overigens dat hier bedoeld wordt dat je beter een sparse array gebruiken kunt als niet elk individueel element van de array benut wordt (wat dus een beetje kant nog wal raakt in dit topic).

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op woensdag 12 juni 2002 15:45 schreef Jappie het volgende:
dat is waar... daarom kan je beter met pointers werken...
het nadeel is dat je dan per project 4 bytes extra gealloceerd worden, plus nog 4 bytes voor het groepje.
je moet ook een hoooop zelf doen (vergeleken met zoiets als JAVA).
maarja... die vector gebruikt waarschijnlijk meer geheugen, omdat daar dus allerelei voorgedefineerde dingen bij zitten.
Kijk - nu wordt de vorige code duidelijk {Array van pointers). Dan werkt de counting lus wel, en hoef je ook geen default ctor te gebruiken.

Overigens heeft een array van pointers op gangbare compilers geen overhead ( "de 4 bytes voor het groepje" die je noemt ).

vector<> is overigens een template, en dat betekent dat'ie geen members compileert die je niet gebruikt -> geen geheugengebruik. Verder zit bij bv. MSVC een deel van de vector code gewoon in de runtime DLL. Je eigen size() method daarentegen komt altijd in jouw programma.

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


Verwijderd

Op woensdag 12 juni 2002 09:55 schreef MSalters het volgende:

[..]

Kan er iemand deze code uitleggen? Volgens mij heeft Project helemaal geen conversie naar bool, en is de middelste expressie van een for-loop een bool. En
als Project wel een conversie heeft naar bool, dan telt dit het aantal initiele Projects die naar true converteren, niet het totale aantal Projects

( En dan heb ik het nog niet eens over het probleem dat Project niet noodzakelijk een default ctor heeft )
had een klein foutje gemaakt, het gaat om een array van pointers naar projecten

op het moment dat er 3 projecten zijn aangemaakt gebeurt er het volende:

int size;
for(size = 0; myproject[size]; size++);

de 1e loop: myproject[0]==een een of ander adress, dus wordt gezien als "true".
de 2e loop: myproject[1]==een een of ander adress, dus wordt gezien als "true".
de 3e loop: myproject[2]==een een of ander adress, dus wordt gezien als "true".
de 4e loop: myproject[3]==NULL, dus wordt gezien als "false".

nu is geld dus size==3.

Verwijderd

het komt erop neer dat ik niet graag voorgedefineerde dingen gebruik, zodat ik gewoon precies weet wat er gebeurt in m"n source...

ik heb ook nog nooit de vector gebruikt, dat ding zal best handig zijn...

toen ik dit toppic las, dacht ik, waarom doet iedereen zo"n moeite met die vector, als je niet weet hoe hij werkt...
het lijkt me logischer om zelf je probleem op te lossen, ipv eerst uit te zoeken hoe object werkt dat je probleem op kan lossen...

maarja... ieder z"n eigen smaak :-)
succes !!

Verwijderd

Op woensdag 12 juni 2002 17:01 schreef Jappie het volgende:
het komt erop neer dat ik niet graag voorgedefineerde dingen gebruik, zodat ik gewoon precies weet wat er gebeurt in m"n source...
Hoe schrijf jij een filetje naar disk? Ga je rotzooien met DMA en in een diskcontroller zitten poken, of gebruik je (f)write?
toen ik dit toppic las, dacht ik, waarom doet iedereen zo"n moeite met die vector, als je niet weet hoe hij werkt...
Om de STL, een integraal deel van de taal C++ te leren?
het lijkt me logischer om zelf je probleem op te lossen, ipv eerst uit te zoeken hoe object werkt dat je probleem op kan lossen...
Het lijkt mij logischer om één keer te leren hoe een vector werkt, jezelf ervan te overtuigen dat het een zeer efficient ontworpen generic is, en er vervolgens gebruik van te maken.

Natuurlijk heeft het zijn charme iedere keer opnieuw het wiel uit te vinden, maar het schiet niet echt op...

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op woensdag 12 juni 2002 17:01 schreef Jappie het volgende:
het komt erop neer dat ik niet graag voorgedefineerde dingen gebruik, zodat ik gewoon precies weet wat er gebeurt in m"n source...

[knip]
het lijkt me logischer om zelf je probleem op te lossen, ipv eerst uit te zoeken hoe object werkt dat je probleem op kan lossen...
Tsja, totdat je de mensen achter de standaard tegenkomt en je je realiseert dat "die er meer van hebben vergeten dan ik ooit ga weten" :) (Nou ja, van de library dan)

Maar dit is wel een van de dingen die je moet leren als pro in dit vak: beter goed gejat als slecht verzonnen - zeker als het uit een ander deel van htzelfde programma komt.

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


  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 05-09 22:11
Koste ff tijd maar het is opgelost. Ik heb gebruik gemaakt van een vector.
code:
1
ps1 = PM.FindProjectOnIndex(m_num);

PM een projectmanager.
Vervolgens is probleem opgelost.

http://hawvie.deviantart.com/

Pagina: 1