Avatar billede krismort Nybegynder
29. september 2002 - 16:37 Der er 5 kommentarer og
1 løsning

hvorfor virker det her ikke ?

#include <iostream.h>

class C_2
{
public:
int i;
C_1        *pc_1;

    C_2()
    {
        i=2;
        pc_1 = new C_1(this);
    }
};

class C_1
{
public:
int i;
C_2    *pc2;

    C_1(C_2 *pC2)
    {
        pc2 = pC2;
        i = 1;

        cout << "CTOR C_1" << endl;
        pc2->i = 2;
    }
};
void main()
{
    C_2 c2;
    cout << "C2.i = " << c2.i << endl;
    cout << "C1.i = " << c2.pc_1->i << endl;
}
Avatar billede mbulow Nybegynder
29. september 2002 - 18:38 #1
Øj... Det var dog en hidsig sag du har der :) Og det skulle da undre mig om det ikke er en meget søgt situation du har skabt ;) hehe

Først opdagede jeg det at du i C_2 har en pointer af typen C_1, og at du i C_1 har en pointer af typen C_2.
Det kunne da nemt klares ved at sikre at enhver klasse er deklareret før den bruges:

//Class declaration
class C_1;

//Class definition
class C_2{
  public:
      C_1 *pc_1;
      //En masse andet
};

//Class definition
class C_1{
  public:
      C_2 *pc2;
      //En masse andet
};

På den måde er kompileren klar over, når den når linjen med:
  C_1 *pc_1;
at der eksisterer en klasse med navnet C_1, men at den først bliver defineret senere :)



Så var det jeg opdagede de to linjer her:
  pc_1 = new C_1(this);
og
  pc2->i = 2;

Så er pludselig ikke længere nok at klasserne er deklareret før de bliver brugt... Nu skal de <censur> også være defineret først, og det jo noget helt andet.

For at løse det bliver du nødt til at oprette hver klasse i sit eget fil-sæt (.h og .cpp):

C2.h
----
#ifndef C2_H__INCLUDED
#define C2_H__INCLUDED

class C_1;  //Bruger her kun en klasse deklaration, fordi klassen kun har
            //en pointer til klassen, og ikke behøber kende til dens
            //definition

class C_2{
  public:
      int i;
      C_1 *pc_1;  //<--- Den her pointer jeg snakker om
      C_2();
};

#endif  //C2_H__INCLUDED





C2.h
----
#include "C2.h"  //Skal selvfølgelig kende til C_2-klassen
#include "C1.h"  //Skal bruge definitionen af C_1-klassen

C_2::C_2(){
  i=2;
  pc_1 = new C_1(this);  //C_1 definitionen nødvendig pga. den her linje
}





C1.h
----
#ifndef C1_H__INCLUDED
#define C1_H__INCLUDED

class C_2;  //Den samme kommentar som i C2.h

class C_1{
  public:
      int i;
      C_2 *pc2;    //<---- Pointeren
      C_1(C_2 *pC2);
};

#endif  //C1_H__INCLUDED





C1.cpp
------
#include "C1.h"  //Skal selvfølgelig kende til C_1-klassen
#include "C2.h"  //Skal bruge definitionen af C_2-klassen
#include <iostream.h>

C_1::C_1(C_2 *pC2){
  pc2 = pC2;
  i = 1;
  cout << "CTOR C_1" << endl;
  pc2->i = 2;    //C_2 definitionen nødvendig pga. den her linje
}



main.cpp
--------
#include "C1.h"  //Har brug for definitionerne af både C_1 og C_2
#include "C2.h"
#include <iostream.h>

void main(){
    C_2 c2;
    cout << "C2.i = " << c2.i << endl;
    cout << "C1.i = " << c2.pc_1->i << endl;
}
Avatar billede mbulow Nybegynder
29. september 2002 - 18:40 #2
UPS!!! NAVNET PÅ FILEN I DEN HER KLUMP KODE ER SELVFØLGELIG
  C2.cpp
og ikke C2.h... Mindre tastefejl fra min side

C2.cpp
------
#include "C2.h"  //Skal selvfølgelig kende til C_2-klassen
#include "C1.h"  //Skal bruge definitionen af C_1-klassen

C_2::C_2(){
  i=2;
  pc_1 = new C_1(this);  //C_1 definitionen nødvendig pga. den her linje
}
Avatar billede mbulow Nybegynder
29. september 2002 - 18:46 #3
Blev vist lidt ustruktureret... Håber du forstår hvad jeg mener... Ellers spørger du bare om det du er i tvivl om ;)
Avatar billede krismort Nybegynder
29. september 2002 - 18:57 #4
Ustruktureret hehe så skulle du se den kode jeg laver til dagligt det her er ingenting ! :) Du skal ihvertfald have mange tak!
Avatar billede krismort Nybegynder
29. september 2002 - 18:58 #5
Lige et lille side sprøgsmål ..  hvad er entligt forskellen på #pragma once og #ifndef , #define , #endif ?
Avatar billede mbulow Nybegynder
29. september 2002 - 19:19 #6
Forskellen på #pragme once og #ifndef.....

Ganske godt spørgsmål, men jeg har desværre ikke noget særligt godt svar, for jeg har aldrig brugt "#pragma once" versionen.

Men jaja... Jeg blev selv lidt nysgerrig, så jeg gik igang med en hurtig søgning på groups.google.com

Efter hvad jeg har forstået gør #pragme once, det at den fortæller kompileren at den kun på inkludere filen én gang.

Med #ifndef versionen bliver filerne inkluderet hver gang, men den del der står mellen #ifndef og #endif bliver kun effektivt inkluderet én gang.

Der har #ifndef måske en lille fordel, idet man kan skrive noget i en header-fil, uden for #ifndef, #endif blokken, som bliver inkluderet hver gang. Ikke at jeg sådan lige her og nu kan se fordelen ved det, men nogen kan sikkert udnytte det :)

Og så var der lige en der skrev noget om at #pragma once, vist ikke er lige så understøttet af kompilerne som #ifndef-versionen, men det ved jeg nu ikke hvor meget hold der er i



Tjaa... Jeg holder mig nu bare til #ifndef-versionen, indtil jeg finder ud af at der er et problem med det... :)
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