26. april 2004 - 18:04Der er
10 kommentarer og 1 løsning
Klasser og MFC
Hejsa!
Jeg har lige et spørgsmål angående alle de klasser der i MFC. Hvis jeg fx skriver:
--- class test{ public: CFile f; };
int main() { test t; vector<test> hej; hej.push_back(t); } ---
Så får jeg fejl i filen <vector>, linie 575: ...\include\vector(575): error C2440: 'initializing' : cannot convert from 'const test' to 'test'
Hvis jeg derimod skriver --- class dau{ };
class test{ public: dau f; };
int main() { test t; vector<test> hej; hej.push_back(t); } --- ..altså bare bruger en af mine egne klasser, så er der ingen problemer.. Hvad er der galt?
Mit gæt er at vector kræver = operator og copy constructor, men at klassen test ikke har den med en CFile da CFile ikke har dem, men at den har dem med klassen dau, da den har default af de to.
class abc { public: abc(){} private: abc(const abc& src){} };
class test { public: abc f; };
giver præcis samme fejl som narrr beskriver. Rettes klassen abc til
class abc { public: abc(){} abc(const abc& src){} private: };
kompilerer det. std::vector kræver en copy-constructor eller operator= .
arne_v: At en klasse indeholder andre klasser har intet med arv at gøre. Men at anvende pointere til objekter istedet for instanser af objekter er da en god ide, så har man jo selv styr på, hvornår klassens data konstrueres.
Det mener jeg altså. Hvis man set bort fra lidt syntax detaljer og nogle C++ specifikke semtantisk detaljer, så er resultatet i begge tilfælde at en klasse får alle variable og metoder fra en anden klasse. Syntaxen er lidt anderledes. Variablene kommer til at ligge lidt anderledes i memeory. Der er lidt forskelle i visbility reglerne, polymorfisme supporten og cast mulighederne. Men grundliggende er det meget ens. Derfor mener jeg at man i de fleste tilfælde bør erstatte variable som selv er classes med pointere til samme og i de resterende tilfælde bør man tage skridtet fuldt ud og lave det som C++ arv, fordi det giver lidt flere muligheder.
Ja okay, MFC's klasser mangler en copy-constructor og operator=.. Jeg bruger bare en pointer så.. Hvis I vil have p0ints skal jeg lige bruge et par svar:) Og tak for hjælpen.
> Angående CFile og copy og = operator, så giver det vel god mening at man ikke kan kopiere et file-objekt.
> Angående arv og eje et object af en class: Jeg har lært at arv bruges til is-a og members bruges til has-a. Det giver således god mening at lade en heste-class arve fra en dyr-class, og heste-class'en kan have en instans af en hale-class som member, hvorimod det ikke giver mening at lade heste class'en arve fra en hale-classen. En hest is-a dyr og den has-a hale.
Om man så fortrækker at have en pointer til objektet eller have objektet direkte afhænger mest af hvornår member'en bliver oprettet og nedlagt.
Jeg er selvfølgelig helt enig i is-a og has-a reglerne.
Men jeg vil lave is-a med arv, has-a med pointer og aldrig has-a med direkte member.
* direkte member constructor skal kaldes først i constructor * direkte member kan ikke være NULL d.v.s. 1:0..1 kan ikke laves den måde * direkte member kan ikke lave M:1
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.