Dat bedoelde ik niet nee. Ik ken C# niet, het ziet er in ieder geval afschuwelijk uitquote:Op woensdag 5 januari 2011 11:44 schreef _Led_ het volgende:
[..]
Want in C# kun je niet
[ code verwijderd ]
schrijven bedoel je ?
Preciesquote:Op woensdag 5 januari 2011 12:56 schreef thabit het volgende:
Dit is natuurlijk een stuk beter:
[ code verwijderd ]
Och, die regel kun je ook een heel stuk compacter schrijven hoor, net zoals dat stuk C++ trouwens.quote:Op woensdag 5 januari 2011 13:38 schreef Thomass het volgende:
Dat bedoelde ik niet nee. Ik ken C# niet, het ziet er in ieder geval afschuwelijk uit
Ja lelijke code willen we natuurlijk niet hebben hèquote:Op woensdag 5 januari 2011 13:40 schreef _Led_ het volgende:
[..]
Och, die regel kun je ook een heel stuk compacter schrijven hoor, net zoals dat stuk C++ trouwens.
Als je wilt kun je in elke taal lelijke code schrijven
Totdat de stack vol zit, daarna krijg je een segfault.quote:Op donderdag 6 januari 2011 00:25 schreef TeringHenkie het volgende:
On-topic, er ging voor mij een hele wereld open toen ik er achter kwam dat je objecten gewoon op de stack aan kan maken ipv. alleen maar op de heap. Hoe ver kun je daar mee gaan?
Dus kleine objecten op de stack, grote op de heap zodat die niet gefragmenteerd raakt?quote:Op donderdag 6 januari 2011 10:00 schreef thabit het volgende:
[..]
Totdat de stack vol zit, daarna krijg je een segfault.. Hangt dus van je stackruimte af en van de grootte van de objecten. Het lijkt me sowieso raadzaam om zuinig om te gaan met stackruimte in het algemeen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | enum Name{ sub1,sub2 }; class Master{ protected: Name _NAME; }; class Sub1:public Master{ _NAME = sub1; }; class Sub2:public Master{ _NAME = sub2; }; |
Je zou bijvoorbeeld een memberconstante aan kunnen maken die je bij de een initialiseerd op een andere waarde dan bij de ander. Maar ik geloof dat er betere oplossingen zijn, al weet ik niet precies welke (in c# had je typeof(), maar ik geloof niet dat er zoiets is in c++)quote:Op vrijdag 7 januari 2011 14:52 schreef netolk het volgende:
Hey, zou deze code anders kunnen?
[ code verwijderd ]
Ik wil deze classes in een vector<Master> stoppen, maar dan wil ik wel weten wat voor class (sub1,sub2) het is.
Is daar een andere oplossing voor dan een enum?
Die member constante komt dan toch ongeveer overeen met de oplossing die ik had bedacht?quote:Op zaterdag 8 januari 2011 14:17 schreef minibeer het volgende:
[..]
Je zou bijvoorbeeld een memberconstante aan kunnen maken die je bij de een initialiseerd op een andere waarde dan bij de ander. Maar ik geloof dat er betere oplossingen zijn, al weet ik niet precies welke (in c# had je typeof(), maar ik geloof niet dat er zoiets is in c++)
o, had ik niet gezienquote:Op zaterdag 8 januari 2011 21:43 schreef netolk het volgende:
[..]
Die member constante komt dan toch ongeveer overeen met de oplossing die ik had bedacht?
Je kunt met een dynamic_cast checken of een een pointer naar een base class naar een gegeven afgeleide klasse verwijst. Zie http://en.wikibooks.org/wiki/C++_Programming/RTTIquote:Op vrijdag 7 januari 2011 14:52 schreef netolk het volgende:
Hey, zou deze code anders kunnen?
[ code verwijderd ]
Ik wil deze classes in een vector<Master> stoppen, maar dan wil ik wel weten wat voor class (sub1,sub2) het is.
Is daar een andere oplossing voor dan een enum?
Zo'n dynamic cast kost zeker wel weer veel resources of niet?quote:Op zondag 9 januari 2011 19:19 schreef thabit het volgende:
[..]
Je kunt met een dynamic_cast checken of een een pointer naar een base class naar een gegeven afgeleide klasse verwijst. Zie http://en.wikibooks.org/wiki/C++_Programming/RTTI
Valt wel mee denk ik, volgens mij bepaalt hij de validiteit van de cast aan de hand van de vtable.quote:Op zondag 9 januari 2011 21:39 schreef netolk het volgende:
[..]
Zo'n dynamic cast kost zeker wel weer veel resources of niet?
Ow ok, het ziet er wel handiger uit dan zo'n member te maken waar je aan kunt zien wat het isquote:Op zondag 9 januari 2011 21:45 schreef thabit het volgende:
[..]
Valt wel mee denk ik, volgens mij bepaalt hij de validiteit van de cast aan de hand van de vtable.
Maar hoe doe je zo iets dan?quote:Op zondag 9 januari 2011 22:07 schreef thabit het volgende:
Je kunt bijvoorbeeld ook een virtual method is_Sub1 aanmaken, die false returnt in de base class en true in Sub1. Lijkt me wat schoner dan met rtti kloten.
1 2 3 4 5 6 7 8 | class Base { public: virtual bool is_Sub1() const {return false;} }; class Sub1: public Base { bool is_Sub1() const {return true;} }; |
Ja, waarschijnlijk is het het best om met templates te werken enzo maar dat moet ik dan weer opzoeken hoe dat werkt en dit snap ik teminste redelijk...quote:Op maandag 10 januari 2011 15:16 schreef thabit het volgende:
Die const kun je ook weglaten. Is alleen om de compiler te vertellen dat de methode niet aan de members van de klasse loopt te frunniken.
Ik denk persoonlijk echter, dat als je een klasse hebt met 7 subklassen waarvoor je type-identificatie nodig hebt, dat dan zeer waarschijnlijk je design voor verbetering vatbaar is.
Ja dat had ik dus eerst maar toen vroeg ik of het beter kon en kwam er dus die rtti dingen voorquote:Op maandag 10 januari 2011 19:11 schreef TeringHenkie het volgende:
Je kan toch ook een pure virtual method maken in je base class die een waarde uit een enum typeofsubclass oid. returnet? Of denk ik nu te simpel?
1 2 3 4 5 6 7 8 9 | #ifndef _HEADERA_H #define _HEADERA_H #include "HeaderB.h" namespace A{ class A_Class{ B::B_Class _DINGES; }; }; #endif |
1 2 3 4 5 6 7 8 9 | #ifndef _HEADERB_H #define _HEADERB_H #include "HeaderA.h" namespace B{ class B_Class{ A::A_Class *_BLA; }; }; #endif |
Ja die pointer heb ik... maar hoe kan ik een forward declaratie doen als het in een namespace staat?quote:Op woensdag 12 januari 2011 18:02 schreef thabit het volgende:
Je declareert in A_Class een member van type B_Class, terwijl het mogelijk is dat B_Class op dat moment nog niet gedefinieerd is. De compiler moet weten hoeveel geheugenruimte een object van een class en daarmee dus ook elke member van die class inneemt.
Als je dus dergelijke cross-references wilt toepassen dan moet je dat dus doen middels een pointer of een reference, daarvan ligt namelijk de hoeveelheid geheugenruimte gewoon vast. Je moet dan nog wel forward declaraties class A_class; en class B_class; invoegen.
1 2 3 | namespace A { class A_Class; } |
_Dinges moet natuurlijk wel een pointer of een reference zijn, zoals ik een paar posts terug heb uitgelegd.quote:Op woensdag 12 januari 2011 19:02 schreef netolk het volgende:
nee, dan krijg ik een error in header A, dat _DINGES een incomplete type is
Ow hehe, vet stom vergeten het bestand op te slaan ofzo want nu doet ie het dus welquote:Op donderdag 13 januari 2011 11:22 schreef thabit het volgende:
[..]
_Dinges moet natuurlijk wel een pointer of een reference zijn, zoals ik een paar posts terug heb uitgelegd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | inline void file::write_part(segment *the_segment, ::nntp::decoded_article_ptr decoded) { boost::mutex::scoped_lock lock(write_mutex); // make sure we are the only ones messing with segments std::string filename; // cache file name std::string data; // cache decoded data // get the filename and data from the decoded article decoded->filename(filename, false); decoded->data(data); // open file out_file.open(filename.c_str(), std::ios_base::binary | std::ios_base::out); // if it is a multipart binary, seek to the right position if (decoded->multipart()) out_file.seekp(decoded->begin() - 1); // did we arrive at the right position? if (decoded->multipart() && out_file.tellp() != decoded->begin() - 1) std::cout << "File '" << filename << "', segment " << the_segment->segment_number() << " at position " << out_file.tellp() << ", expected to be at " << decoded->begin() - 1 << std::endl; // write the data out_file.write(data.c_str(), data.length()); // close the file out_file.close(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | inline void file::write_part(segment *the_segment, ::nntp::decoded_article_ptr decoded) { boost::mutex::scoped_lock lock(write_mutex); // make sure we are the only ones messing with segments std::string filename; // cache file name std::string data; // cache decoded data // get the filename and data from the decoded article decoded->filename(filename, false); decoded->data(data); // open file if necessary if (!out_file.is_open()) out_file.open(filename.c_str(), std::ios_base::binary | std::ios_base::out); // are we at the right spot? if (decoded->multipart() && out_file.tellp() != decoded->begin() - 1) std::cout << "File '" << filename << "', segment " << the_segment->segment_number() << " at position " << out_file.tellp() << ", expected to be at " << decoded->begin() - 1 << std::endl; // write the data out_file.write(data.c_str(), data.length()); // close the file if (the_segment->segment_number() == segment_list.size()) out_file.close(); } |
Daar heb ik al gekeken. Kan daar niets vinden wat aangeeft waarom dit niet zou moeten werken.quote:Op maandag 24 januari 2011 23:59 schreef netolk het volgende:
misschien heb je hier iets aan?
http://www.cplusplus.com/reference/iostream/ostream/seekp/
krijg je ook een foutmelding (throw) zo ja welke?
Het beste van beidequote:Op dinsdag 25 januari 2011 00:49 schreef TeringHenkie het volgende:
Lekker aan het crossposten op GoT?![]()
a->b is hetzelfde als (*a).b (tenzij een van de operators overloaded is).quote:Op dinsdag 25 januari 2011 18:44 schreef minibeer het volgende:
wat doet "->" precies? ik zie het vaak bij "this" gebruikt worden, maar ik weet niet precies wat het betekent.
ah, pointers he, ik dacht dat ik ze wel doorhad maar het blijft wennen...quote:Op dinsdag 25 januari 2011 19:01 schreef thabit het volgende:
[..]
a->b is hetzelfde als (*a).b (tenzij een van de operators overloaded is).
WTF, heb je ergens een bron waar dit wordt uitgelegd? Dat is wel erg maf gedrag.quote:Op woensdag 26 januari 2011 07:42 schreef nightsleeper het volgende:
Bedankt voor alle hulp iedereen, het probleem zat hem in het feit dat een bestaand bestand openen en daarin zoeken alles weggooit tenzij je het bestand ook met std::ios_base::in opent.
http://stdcxx.apache.org/doc/stdlibug/30-3.htmlquote:Op woensdag 26 januari 2011 09:57 schreef Core2 het volgende:
[..]
WTF, heb je ergens een bron waar dit wordt uitgelegd? Dat is wel erg maf gedrag.
gebruik dan ook gewoon std::ifstream dan gaat het altijd goedquote:Op woensdag 26 januari 2011 07:42 schreef nightsleeper het volgende:
Bedankt voor alle hulp iedereen, het probleem zat hem in het feit dat een bestaand bestand openen en daarin zoeken alles weggooit tenzij je het bestand ook met std::ios_base::in opent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class BUILDING{ //code }; class StoreHouse:public BUILDING{ // code public: unsigned get_Wood(); unsigned get_Stone(); }; Building::StoreHouse *SHptr; Building::BUILDING *Bptr;; for(unsigned i = 0; i < _BUILDINGS.size();i++){ if(_BUILDINGS[i].get_Name() == Names::nStoreHouse){ // checkt of het wel echt een StoreHouse is en geen ander gebouw *Bptr = _BUILDINGS[i]; *SHptr = reinterpret_cast<Building::StoreHouse*>(Bptr); _WOOD += SHptr->get_Wood(); _STONE += SHptr->get_Stone(); } } |
1 | error: no match for 'operator=' in '*SHptr = (Building::StoreHouse*)Bptr' |
wtf, dat is gewoon dom van mij...quote:Op donderdag 27 januari 2011 20:52 schreef thabit het volgende:
[ code verwijderd ]
Dat sterretje aan het begin hoort er niet.
1 | *Bptr = _BUILDINGS[i]; |
1 | Bptr = &(_BUILDINGS[i]); |
txs die haakjes hoeven nietquote:Op donderdag 27 januari 2011 21:45 schreef thabit het volgende:
Het probleem zit hem in
[ code verwijderd ]
Je roept hier een assignment operator aan, terwijl Bptr niet geinitialiseerd is. Kortom, je zit iets naar een min of meer random geheugenadres te kopieren. In plaats daarvan moet je
[ code verwijderd ]
doen. (Geen idee of die haakjes daar nodig zijn, te lui om op te zoeken.). Nog netter is het om zoveel mogelijk met references ipv pointers te werken, maar soit.
Tijdje terug maar AFAIK: Met references kun je niet goochelen, een pointer kun je echt overal naartoe laten wijzen. Je kunt met references dus minder snel fouten maken.quote:Op vrijdag 28 januari 2011 13:51 schreef netolk het volgende:
txs die haakjes hoeven nietmaar waarom is het netter om met references te werken ipv met pointers?
ow zo, ik weet niet zo veel van reference maar die kan je dan ook gewoon als class.function() gebruiken? als class een reference is naar die class?quote:Op vrijdag 28 januari 2011 13:56 schreef Catbert het volgende:
[..]
Tijdje terug maar AFAIK: Met references kun je niet goochelen, een pointer kun je echt overal naartoe laten wijzen. Je kunt met references dus minder snel fouten maken.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |