/ 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
statiske pointere/arrays i klasser
Fra : SuneF


Dato : 26-05-01 16:11

Jeg har forsøgt at omskrevet et program til objekt orienteret kode.
Det gik faktisk overraskende smertefrit, eneste bøvl jeg har er:

A:
Statiske funktionspointere til statiske funktioner inden i samme klasse.

Tidligere havde jeg erklæret dem externe og lavet en tilsvarende erklæring (uden extern)
udenfor headerfilen i en alm. *.cpp fil, og det virkede.

Jeg har læst mig til at statiske variable ligeledes skal erklæres udenfor klassen (eller initialiseres).
Nu er mit spørgsmål hvordan jeg gør det med en pointer til en funktion?
Eksempel:

class myC{
public:
static double Func(void);
static double (*pFunc)(void);
};

Nu mangler der vist noget før jeg kan få lov til at brug den med:
myC::pFunc = &myC::Func;

men hvad?

B:
Så har jeg en klasse A og en klasse B, hvor klassen B skal have et instance af klassen A.
Jeg får fejlen "base class undefined", men hvis jeg kopierer klasse A ind i samme headerfil som klasse B,
så virker det. Skal headerfilerne inkluderes i hinanden på en bestemt måde, jeg ville da mene at
#include "A.h" i B.h filen ville være tilstrækkeligt, men nej !?!?

Takker,
Sune



 
 
Anders Bo Rasmussen (26-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 26-05-01 18:26

On Sat, 26 May 2001 17:10:40 +0200,
SuneF <noluck@nowhere.dk> wrote:

>B:
>Så har jeg en klasse A og en klasse B, hvor klassen B skal have et instance af klassen A.
>Jeg får fejlen "base class undefined", men hvis jeg kopierer klasse A ind i samme headerfil som klasse B,
>så virker det. Skal headerfilerne inkluderes i hinanden på en bestemt måde, jeg ville da mene at
>#include "A.h" i B.h filen ville være tilstrækkeligt, men nej !?!?

Er det noget lig følgende (som compilere her, og er korrekt SVJV):

A.h:

class A
{
int x;
};

B.h:

#include "A.h"

class B
{
   A y;
};

C.cpp:

#include "B.h"

int main()
{
   B z;
}

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

SuneF (26-05-2001)
Kommentar
Fra : SuneF


Dato : 26-05-01 19:52

> Er det noget lig følgende (som compilere her, og er korrekt SVJV):

Ja jeg kan ikke se nogen væsenlige forskelle, men så igen skal der jo ikke meget til ;)

Jeg har prøvet med gcc og den kommer med fejlen:

>ISO C++ forbids declaration of `BITMAP' with no type
>parse error before `['

Nogen der ved havd det mon betyer?


Mine rigtige klasser er her:

class BITMAP{
public:
void bmp_read(char filename[]);
void bmp_read_header(char filename[]);
void bmp_write(char filename[]);
void bmp_write_slide(PIXEL *, long, char filename[]);
void bmp_print_header();
void file_compare( void );

public:
char intro[14];
long size;
long width;
long height;
char planes[2];
char bitcount[2];
long compress;
long sizeimg;
long xpix;
long ypix;
long colorsused;
long impcolor;
PIXEL pixel[64*96];

};

class HOPFIELD_ANN{
public:
void Setup_HNN(void);
void Train_HNN(void);
void Test_HNN(void);
void Anneal_HNN(void);
float Energy_HNN(void);

public:
float w[64*96][64*96];
static long imagewidth;
static long imageheight;
static long samples;
static long digits;
static long SizeOfHNNEnsemble;
static BITMAP bitmaps[10][10];
};


Det meste er irrelevant, men det er den sidste linie i HOPFIELD klassen der er problemet.



Anders Bo Rasmussen (26-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 26-05-01 19:59

On Sat, 26 May 2001 20:52:07 +0200,
SuneF <noluck@nowhere.dk> wrote:

>Det meste er irrelevant, men det er den sidste linie i HOPFIELD klassen der er problemet.

Det compilere her (bortset fra at main ikke findes), hvis man skifter
PIXEL ud med int. Det må være dine #include's der er noget galt med. Kan
du ikke koge eksemplet ned så det er overskueligt, og stadig indeholder
fejlen. Der er en chance for du selv finder fejlen ved at gøre dette. Og
ellers er der sikkert en her der hurtigt kan se fejlen.

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

SuneF (26-05-2001)
Kommentar
Fra : SuneF


Dato : 26-05-01 21:34

> Det compilere her (bortset fra at main ikke findes), hvis man skifter
> PIXEL ud med int. Det må være dine #include's der er noget galt med.

Det mener jeg også.

> Kan
> du ikke koge eksemplet ned så det er overskueligt, og stadig indeholder
> fejlen. Der er en chance for du selv finder fejlen ved at gøre dette. Og
> ellers er der sikkert en her der hurtigt kan se fejlen.

Okay, prøvede at skille de tre filer ud det drejede sig om, og vupti den kompilerede (typisk;).
Hvordan kan de andre filer spille nogen rolle, det fatter jeg bare ikke en bønne af.
Er der nogen regler for hvordan man inkluderer headere i hinanden?
Jeg havde forestillet mig at lave en headerfil som har alt inkluderet, og så bare inkludere den i alt.



Anders Bo Rasmussen (26-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 26-05-01 21:52

On Sat, 26 May 2001 22:33:36 +0200,
SuneF <noluck@nowhere.dk> wrote:

>> Det compilere her (bortset fra at main ikke findes), hvis man skifter
>> PIXEL ud med int. Det må være dine #include's der er noget galt med.
>
>Det mener jeg også.
>
>> Kan
>> du ikke koge eksemplet ned så det er overskueligt, og stadig indeholder
>> fejlen. Der er en chance for du selv finder fejlen ved at gøre dette. Og
>> ellers er der sikkert en her der hurtigt kan se fejlen.
>
>Okay, prøvede at skille de tre filer ud det drejede sig om, og vupti den kompilerede (typisk;).

Prøv at gør det lidt ad gangen, og se på den måde hvad der er galt.

>Hvordan kan de andre filer spille nogen rolle, det fatter jeg bare ikke en bønne af.

Måske nogle #ifndef's ?

>Er der nogen regler for hvordan man inkluderer headere i hinanden?

Nej. #include tager simpelt hen bare teksten fra den anden fil. Det er
preproccesoren der tager sig af dette.

>Jeg havde forestillet mig at lave en headerfil som har alt inkluderet, og så bare inkludere den i alt.

Så skal alt kompileres hver gang du ændre i en headerfil.

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

Igor V. Rafienko (26-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 26-05-01 20:03

* noluck@nowhere.dk

> Jeg har læst mig til at statiske variable ligeledes skal erklæres
> udenfor klassen (eller initialiseres). Nu er mit spørgsmål hvordan
> jeg gør det med en pointer til en funktion?


Det er en forskjell mellom statiske medlemsfunksjoner og vanlige
medlemsfunksjoner. Pekere til disse vil naturligvis være forskjellige.


> Eksempel:
>
> class myC{
> public:
> static double Func(void);
> static double (*pFunc)(void);
> };
>
> Nu mangler der vist noget før jeg kan få lov til at brug den med:
> myC::pFunc = &myC::Func;


Det skal faktisk holde å si Func. Initialisering av statiske medlemmer
skjer i navnerommet til klassen de hører til (man lærer noe nytt hver
dag).


> men hvad?

[quote]
A static member function is an ordinary funtion
[/quote]

Altså:

class myC
{
static double Func( void ){ std::cerr << "flabba\n"; }
static double (*pfunc)( void );
};

double (*myC::pfunc) = Func;

int
main()
{
(myC::pfunc)();
}

whoops!





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

SuneF (26-05-2001)
Kommentar
Fra : SuneF


Dato : 26-05-01 20:59


> Det skal faktisk holde å si Func. Initialisering av statiske medlemmer
> skjer i navnerommet til klassen de hører til (man lærer noe nytt hver
> dag).

> Altså:
>
> class myC
> {
> static double Func( void ){ std::cerr << "flabba\n"; }
> static double (*pfunc)( void );
> };
>
> double (*myC::pfunc) = Func;
>
> int
> main()
> {
> (myC::pfunc)();
> }

Undskyld jeg er ikke helt klar over hvad "navnerummet" er?

Tror du ikke også det hellere skal være:
double (*myC::pfunc) = myC::Func;

Anyway, jeg har prøvet begge dele og får fejlen:
"redefinition; different types of indirection"



Igor V. Rafienko (26-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 26-05-01 21:09

* noluck@nowhere.dk

[snip]

> > class myC
> > {
> > static double Func( void ){ std::cerr << "flabba\n"; }
> > static double (*pfunc)( void );
> > };
> >
> > double (*myC::pfunc) = Func;
> >
> > int
> > main()
> > {
> > (myC::pfunc)();
> > }
>
> Undskyld jeg er ikke helt klar over hvad "navnerummet" er?


namespace. Bokstavelig oversettelse fra engelsk. Dersom pfunc
initialiseres med navnet 'foo' vil man slå opp 'myC::foo' først.


> Tror du ikke også det hellere skal være:
> double (*myC::pfunc) = myC::Func;


Nope. Du kan godt skrive det, men du må ikke.


> Anyway, jeg har prøvet begge dele og får fejlen:
> "redefinition; different types of indirection"


Har du minste kodesnutt som viser problemet?





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

SuneF (26-05-2001)
Kommentar
Fra : SuneF


Dato : 26-05-01 21:22

Jeg skrev:

I klassen:

class FEEDFORWARD_ANN{
public:
......
static double Activation_tanh(double);
static double (*pActivation_Function)(double);
.....
};

double (*FEEDFORWARD_ANN::pActivation_Function) = Activation_tanh;


og får fejlen:
error C2372: 'public: static double (__cdecl* FEEDFORWARD_ANN::pActivation_Function)(double)' : redefinition; different types of
indirection


"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message news:xjveltbvpn8.fsf@gjallarhorn.ifi.uio.no...
> * noluck@nowhere.dk
>
> [snip]
>
> > > class myC
> > > {
> > > static double Func( void ){ std::cerr << "flabba\n"; }
> > > static double (*pfunc)( void );
> > > };
> > >
> > > double (*myC::pfunc) = Func;
> > >
> > > int
> > > main()
> > > {
> > > (myC::pfunc)();
> > > }
> >
> > Undskyld jeg er ikke helt klar over hvad "navnerummet" er?
>
>
> namespace. Bokstavelig oversettelse fra engelsk. Dersom pfunc
> initialiseres med navnet 'foo' vil man slå opp 'myC::foo' først.
>
>
> > Tror du ikke også det hellere skal være:
> > double (*myC::pfunc) = myC::Func;
>
>
> Nope. Du kan godt skrive det, men du må ikke.
>
>
> > Anyway, jeg har prøvet begge dele og får fejlen:
> > "redefinition; different types of indirection"
>
>
> Har du minste kodesnutt som viser problemet?
>
>
>
>
>
> ivr
> --
> Documentation is like sex: when it is good, it is very, very good; and
> when it is bad, it is better than nothing.
> -- Dick Brandon


Igor V. Rafienko (26-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 26-05-01 21:42

* noluck@nowhere.dk

> class FEEDFORWARD_ANN{
> public:
> .....
> static double Activation_tanh(double);
> static double (*pActivation_Function)(double);


Ah, vi har en double argument i deklarasjonen...


> ....
> };
>
> double (*FEEDFORWARD_ANN::pActivation_Function) = Activation_tanh;


.... men, vi har ikke denne i definisjonen:

double (*FEEDFORWARD_ANN::pActivation_Function)( double ) = Activation_tanh;

Prøv denne :)


[snip lots of stuff]

ikke siter det du ikke skal kommentere.





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

SuneF (26-05-2001)
Kommentar
Fra : SuneF


Dato : 26-05-01 22:49



> double (*FEEDFORWARD_ANN::pActivation_Function)( double ) = Activation_tanh;
>
> Prøv denne :)

JA! der var den, nu virker den del ;)
Tak


Igor V. Rafienko (27-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 27-05-01 12:27

* noluck@nowhere.dk

[snip]

> > double (*FEEDFORWARD_ANN::pActivation_Function)( double ) = Activation_tanh;
> >
> > Prøv denne :)
>
> JA! der var den, nu virker den del ;)


Det var det kompilatoren din prøvde å si fra starten av :)





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

Anders Bo Rasmussen (26-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 26-05-01 22:02

On 26 May 2001 21:03:18 +0200,
Igor V. Rafienko <igorr@ifi.uio.no> wrote:

>> Eksempel:
>>
>> class myC{
>> public:
>> static double Func(void);
>> static double (*pFunc)(void);
>> };
>>
>> Nu mangler der vist noget før jeg kan få lov til at brug den med:
>> myC::pFunc = &myC::Func;
>
>
>Det skal faktisk holde å si Func. Initialisering av statiske medlemmer
>skjer i navnerommet til klassen de hører til (man lærer noe nytt hver
>dag).

Interessant opdagelse. Gad vide hvorfor der er sådan?

Er der ikke tale om et "scope" og ikke et "namespace"?

>[quote]
>A static member function is an ordinary funtion
>[/quote]

Det virker bekendt. Bjarnebogen?

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

Carsten Sørensen (27-05-2001)
Kommentar
Fra : Carsten Sørensen


Dato : 27-05-01 02:04

fuzz01@spamfilter.dk (Anders Bo Rasmussen) wrote in
news:slrn9h06ei.47s.fuzz01@localhost.localdomain:
> Interessant opdagelse. Gad vide hvorfor der er sådan?

Det giver vel et eller andet sted mening. Man har jo allerede sagt at
man nu vil give en definition på et medlem af klassen, derfor må
klassens namespace være gyldigt i det efterfølgende. Følgende på samme
måde:

---
class Klasse
{
struct Struktur
{
int Noget;
};

Struktur *Funktion( Struktur * );
};

Klasse::Struktur *Klasse::Funktion( Struktur * )
{
// Bemærk at Klasse:: kun er er nødvendigt inden vi har sagt vi
// ønsker at definere selve member-funktionen. Der efter er klassens
// namespace umiddelbart tilgængeligt
}
---


Carsten Sørensen

Anders Bo Rasmussen (27-05-2001)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 27-05-01 10:32

On Sun, 27 May 2001 01:04:28 +0000 (UTC),
Carsten Sørensen <surfsmurf@rift.dk.invalid> wrote:

>> Interessant opdagelse. Gad vide hvorfor der er sådan?
>
>Det giver vel et eller andet sted mening. Man har jo allerede sagt at
>man nu vil give en definition på et medlem af klassen, derfor må
>klassens namespace være gyldigt i det efterfølgende. Følgende på samme
>måde:

Men der er du jo også inde i en af klassens funktioner og dermed i
klassens scope (hedder det scope eller namespace?). Sådan som jeg
forstod eksemplet var vi ikke inde i en af klassens funktioner. Det
ville altså svare til at man kunne:

class A
{
   public:
      int i,j;
};

int main()
{
   A::i=j;
}


Nu er jeg forvirret. For det giver da ikke mening at det skulle være
anderledes bare fordi variablen er en pointer til en funktion.

--
Anders Bo Rasmussen mailto:fuzz01@spamfilter.dk
Frimestervej 42 1.tv http://www.fuzz.dk
2400 Kbh. NV
Denmark

Carsten Sørensen (27-05-2001)
Kommentar
Fra : Carsten Sørensen


Dato : 27-05-01 12:18

fuzz01@spamfilter.dk (Anders Bo Rasmussen) wrote in
news:slrn9h1id6.um.fuzz01@localhost.localdomain:
> Men der er du jo også inde i en af klassens funktioner og dermed i
> klassens scope (hedder det scope eller namespace?).

Jeg opfatter de to situation som værende helt analoge. Muligvis har jeg
opfattet situationen forkert, men dette her er da kun tilladt under
initialiseringen af statisk data, er det ikke? Her giver man en værdi
til en _static_ variabel:

void (*myC::pFunc)()=Func;

"myC::pFunc=Func;" går vel ikke i fx. main? (Rode med compiler... ikke i
VC++6 i hvert fald, her skal man skrive "myC::pFunc=myC::Func;", men nu
skal man jo ikke tage alt den siger for gode varer, men det virker
selvfølgelig udenfor main.)

Her giver man en værdi til noget andet "statisk data" (data i
anførselstegn da det selvfølgelig ikke ryger i data-segmentet), en
funktion:

Klasse::Struktur *Klasse::Funktion( Struktur * ) { ... }
^
Det er ikke engang klassens krop jeg taler om, men hovedet hvor man ikke
behøver skrive namespacet igen. Jeg synes det giver udmærket mening at
man ikke skal skrive det en gang til i begge tilfælde.

> Det ville altså svare til at man kunne:

Du mener helt sikkert

static int i,j;

?

>
> class A
> {
> public:
> int i,j;
> };
>
> int main()
> {
> A::i=j;
> }
>
>
> Nu er jeg forvirret. For det giver da ikke mening at det skulle
> være anderledes bare fordi variablen er en pointer til en funktion.

Nej, hele humlen ligger i at den er statisk og det er under
_initialiseringen_ man ikke behøver.

---
class Klasse
{
public:
static int &ref;
static int i;
}:

int &Klasse::ref=i;
---

....virker også fremragende.


Carsten Sørensen

Igor V. Rafienko (27-05-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 27-05-01 12:26

* Anders Bo Rasmussen

[snip]

> >[quote]
> >A static member function is an ordinary funtion
> >[/quote]
>
> Det virker bekendt. Bjarnebogen?


Nope -- ISO/IEC 14882:1998(E).





ivr
--
Documentation is like sex: when it is good, it is very, very good; and
when it is bad, it is better than nothing.
                  -- Dick Brandon

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste