Avatar billede narrr Nybegynder
26. april 2004 - 18:04 Der 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?
Avatar billede arne_v Ekspert
26. april 2004 - 19:55 #1
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.
Avatar billede arne_v Ekspert
26. april 2004 - 19:57 #2
Jeg vil iøvrigt normalt fraråde at lade en klasse indeholde andre klasser
på den måde (det svarer faktisk til at arve).

class test{
public:
    CFile *f;
};

og

class test{
public:
    dau *f;
};

så har du mere styr på det (og ingen compile fejl !).
Avatar billede dilleberg Nybegynder
27. april 2004 - 01:14 #3
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.
Avatar billede arne_v Ekspert
27. april 2004 - 08:48 #4
dilleberg>

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.
Avatar billede narrr Nybegynder
27. april 2004 - 14:21 #5
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.
Avatar billede arne_v Ekspert
27. april 2004 - 17:19 #6
svar
Avatar billede bertelbrander Novice
27. april 2004 - 19:42 #7
> 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.
Avatar billede dilleberg Nybegynder
27. april 2004 - 21:11 #8
bertelbrander> Helt enig !
Avatar billede arne_v Ekspert
28. april 2004 - 22:34 #9
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

(egenskaber den deler med arv)
Avatar billede arne_v Ekspert
29. maj 2004 - 00:03 #10
Tid at lukke spørgsmålet ?
Avatar billede narrr Nybegynder
29. maj 2004 - 00:31 #11
Jae, dilleberg vil åbenbart ikke have pts.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester