/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
classes i class
Fra : Bjarke Walling Peter~


Dato : 04-05-02 15:28

Jeg har en class med et tons funktioner - det ville være rart at opdele dem.
Derfor ville jeg gerne kunne gøre (f.eks.) dette:

class myclass a;
a.functions1.somefunction();
a.functions3.anotherfunction();

.... i stedet for:

class myclass a;
a.functions1_somefunction();
a.functions3_anotherfunction();

Jeg har selv lavet følgende løsning, men så vidt jeg kan se er det en ret
besværlig og uholdbar måde at gøre det på. Så jeg vil bare spørge om der er
nogen der har en nemmere/bedre løsning:

#include <cstdio>
#include <cstring>
#include <iostream.h>


class myclass2 {
public:
myclass2(class myclass1 *myclass1_this);
myclass2(); // Skal åbenbart være der
~myclass2();

void juhuu();
private:
class myclass1 *myclass1_this;
};


class myclass1 {
friend class myclass2;
public:
myclass1(char *tekst);
~myclass1();

class myclass2 subfunctions;
private:
char tekst[100];
};


myclass1::myclass1(char *tekst)
{
this->abe=myclass2(this);
strcpy(this->tekst,tekst);
}

myclass1:myclass1()
{
}


myclass2::myclass2(class myclass1 *myclass1_this)
{
this->myclass1_this=myclass1_this;
}

myclass2::myclass2()
{
}

myclass2:myclass2()
{
}

void myclass2::juhuu()
{
cout << this->myclass1_this->tekst;
}


int main(int argc, char *argv[])
{
class myclass1 a("Det virker!");
a.subfunctions.juhuu();

cout << "\n\n";
return 0;
}


.... ud over det er besværligt vil jeg også gerne være fri for
constructoren/destructoren i myclass2. Det er egentlig ikke en class jeg har
brug for - da det kun skal bruges som en underopdeling. Måske skal jeg bruge
noget andet - en struct/union??. Jeg kender blot ikke så meget til C++ at
jeg lige kan regne det ud.

Mvh. Bjarke Walling Petersen



 
 
Claus Rasmussen (04-05-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 04-05-02 15:42

Bjarke Walling Petersen wrote:

> Jeg har en class med et tons funktioner - det ville være rart at opdele
> dem.

Det er som regel et tegn på, at der er noget galt med dit design. Typisk
er det det, der sker, hvis du ikke har for megen erfaring med objekt-
orienteret programmering og blot banker nogle klasser på din procedurale
kode.

Prøv at skriv lidt mere om, hvad det er du har gang i.


> Derfor ville jeg gerne kunne gøre (f.eks.) dette:

Dur ikke. Men du kan bruge namespaces, hvis din compiler supporterer
det:

namespace MineFunktioner {
namespace EenSlagsFunktoiner {
void f();
void g();
};

namespace EnAndenSlagsFunktioner {
void f();
void g();
};
};

int main() {
MineFunktioner::EenSlagsFunktioner::f();
MineFunktioner::EnAndenSlagsFunktioner::f();
}

[...]

> myclass2(); // Skal åbenbart være der

Nej. Men det er meget praktisk at have en default-constructor
(som det hedder). Det gør det muligt at bruge sine klasser
sammen med container librariet.

-Claus


Bjarke Walling Peter~ (04-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 04-05-02 17:09

Claus Rasmussen skrev:
> Det er som regel et tegn på, at der er noget galt med dit design. Typisk
> er det det, der sker, hvis du ikke har for megen erfaring med objekt-
> orienteret programmering og blot banker nogle klasser på din procedurale
> kode.
>
> Prøv at skriv lidt mere om, hvad det er du har gang i.

Jeg er ved at lave en graphic3d class - man kan grovt dele alle funktionerne
op i tre grupper: tegne-funktioner, kamera-funktioner (sætter placering af
kamera, kameraretning m.m.) og funktioner til andre indstillinger.

Derfor ville jeg gerne på en eller anden måde opdele dem.

Mvh. Bjarke



Claus Rasmussen (04-05-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 04-05-02 17:21

Bjarke Walling Petersen wrote:

> Jeg er ved at lave en graphic3d class - man kan grovt dele alle
> funktionerne op i tre grupper: tegne-funktioner, kamera-funktioner (sætter
> placering af kamera, kameraretning m.m.) og funktioner til andre
> indstillinger.

Det er EMM en dårlig ide, at designe sådan noget objektorienteret. Det
er meget bedre at skrive en almindeligt procedural implementation og
så evt. senere lægge et objektorienteret abstraktionslag henover.

Ellers får du en masse bøvl med at få de forskellige ting i din
rendering til at kommunikere - f.eks for at tegne en kasse i billedet
skal kassen have adgang til kameravinkler, lyskilder, andre objekter,
der evt. skygger for kassen osv.

Desuden: Hvis du er nybegynder i C++, ville jeg starte med noget
simplere

-Claus


Bjarke Walling Peter~ (04-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 04-05-02 17:59

Claus Rasmussen skrev:
> Det er EMM en dårlig ide, at designe sådan noget objektorienteret. Det
> er meget bedre at skrive en almindeligt procedural implementation og
> så evt. senere lægge et objektorienteret abstraktionslag henover.

Undskyld, men vil du evt. forklare dette lidt nærmere? - især
"objektorienteret abstraktionslag" :)

> Ellers får du en masse bøvl med at få de forskellige ting i din
> rendering til at kommunikere - f.eks for at tegne en kasse i billedet
> skal kassen have adgang til kameravinkler, lyskilder, andre objekter,
> der evt. skygger for kassen osv.
>
> Desuden: Hvis du er nybegynder i C++, ville jeg starte med noget
> simplere
>
> -Claus

Jeg har lavet alle mine andre ting i classes (graphic2d, timer, vector,
music, etc.) - det ville være noget bøvl hvis det blot lå som global
funktioner.
Apropos - jeg er næsten nybegynder i C++, men jeg har programmeret i
adskillige andre sprog i 6-7 år nu - så jeg skulle ikke have noget problem
med at lave de 3D rutiner.
Men du ret i det med kommunikationen - det er faktisk en del af problemet -
alle funktionerne skal gerne kunne tilgå de samme variabler.

Jeg vil iøvrigt helst ikke benytte namespaces, da det meget gerne skulle
være ret portabelt.

Men egentlig behøver jeg jo ikke at grupere funktionerne - jeg kan nøjes med
at gruppere dem vha. deres navn. Det ville blot være en smule lettere at
arbejde med på den anden måde.

Mvh. Bjarke



Claus Rasmussen (04-05-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 04-05-02 18:12

Bjarke Walling Petersen wrote:

> Undskyld, men vil du evt. forklare dette lidt nærmere? - især
> "objektorienteret abstraktionslag" :)

Hvis vi holder os til 2D som jeg kender bedre, så er her et eksempel:

Procedural implementation:

void draw_line(int x1, int y1, int x2, int y2) { ... }
void draw_rect(int x1, int y1, int x2, int y2) { ... }
void draw_circle(int x, int y, int r) { ... }
osv.

Objektorienteret abstraktionslag:

struct Figure {
virtual void draw();
};

struct Line : Figure {
Line(int x1, int y1, int x2, int y2)
: x1(x1), y1(y1), x2(x2), y2(y2)
{}

virtual void draw() {
draw_line(x1, y1, x2, y2);
}
private:
int x1, y1, x2, y2;
}

struct Rect : Figure {
Rect(int x1, int y1, int x2, int y2)
: x1(x1), y1(y1), x2(x2), y2(y2)
{}

virtual void draw() {
draw_rect(x1, y1, x2, y2);
}
private:
int x1, y1, x2, y2;
}

osv.

Som du kan se, så ligger hele implementationen i det procedurale
lag, som du så smider en objektorienteret abstraktion ind over. Og
som du også kan se, så fylder det objektorienterede en hel del mere
end hvis du bare holdt dig til den procedurale implementation.

[...]

> Men du ret i det med kommunikationen - det er faktisk en del af problemet
> - alle funktionerne skal gerne kunne tilgå de samme variabler.

Netop. Det kunne jeg også forestille mig der ville være problemet i en
3D tegning. De forskellige objekter i modellen er ikke så afkoblede som
de er i 2D. Afkoblet handler her om, hvor meget objekterne skal vide
om hinanden for at kunne tegne sig selv. Det er simpelt i 2D - de tegner
bare ovenpå hinanden. I 3D skal de tage hensyn til alle mulige andre
ting, og det ødelægger den adskillelse af funktionerne som man netop
ellers gerne vil opnå ved at bruge objektorienteret programmering.

[...]

> Men egentlig behøver jeg jo ikke at grupere funktionerne - jeg kan nøjes
> med at gruppere dem vha. deres navn. Det ville blot være en smule lettere
> at arbejde med på den anden måde.

Lyder rigtigt. Jeg vil også sige, at det er bedre at få det til at
virke i første omgang og så senere gøre mere objektorienteret end
den anden vej rundt

-Claus



Morten Brix Pedersen (04-05-2002)
Kommentar
Fra : Morten Brix Pedersen


Dato : 04-05-02 17:24

Bjarke Walling Petersen wrote:
> #include <cstdio>
> #include <cstring>
> #include <iostream.h>

Bemærk at der ikke er en header i C++ standarden kaldet <iostream.h>,
den hedder <iostream>. <iostream.h> er deprecated.

- Morten.


Bjarke Walling Peter~ (04-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 04-05-02 18:54

Morten Brix Pedersen skrev:
> Bemærk at der ikke er en header i C++ standarden kaldet <iostream.h>,
> den hedder <iostream>. <iostream.h> er deprecated.
>
> - Morten.

Ja okay ... men hvordan udskriver man vha. <iostream>? - jeg kan ikke få det
til at virke:

c:\program files\microsoft visual studio\myprojects\test\main.cpp(73) :
error C2065: 'cout' : undeclared identifier
c:\program files\microsoft visual studio\myprojects\test\main.cpp(73) :
error C2297: '<<' : illegal, right operand has type 'char [100]'
c:\program files\microsoft visual studio\myprojects\test\main.cpp(95) :
error C2297: '<<' : illegal, right operand has type 'char [3]'

Mvh. Bjarke



Morten Brix Pedersen (04-05-2002)
Kommentar
Fra : Morten Brix Pedersen


Dato : 04-05-02 20:09

Bjarke Walling Petersen wrote:
> Morten Brix Pedersen skrev:
>
>>Bemærk at der ikke er en header i C++ standarden kaldet <iostream.h>,
>>den hedder <iostream>. <iostream.h> er deprecated.
>>
>> - Morten.
>
>
> Ja okay ... men hvordan udskriver man vha. <iostream>? - jeg kan ikke få det
> til at virke:

Alt i standard C++ library ligger i std namespace, d.v.s. du skal bruge:

std::cout << "foobar" << std::endl;

du kan dog importere std namespace ind i global namespace:

using namespace std;

eller bare importere cout:

using std::cout;

- Morten.


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste