Avatar billede tycho Nybegynder
13. juli 2003 - 23:28 Der er 14 kommentarer og
1 løsning

Et globalt object?

Hej.
Jeg har defineret et klasseobjekt, som jeg gerne vil gøre tilgængeligt for hele mit program (eks. alle mine funktioner skal kunne ændre/benytte det).
Udover at lægge det hele i en fil, er der så en anden måde at gøre det på.
Jeg kan ikke lægge det i en header-fil, da det er ét bestemt objekt de skal kunne bruge.

Et eksempel:
===================
fil1.cpp:

minKlasse Jordbør;

fil2.cpp:

Jordbær.sødme = 15;
===================
Er det muligt?
-På forhånd tak.
Avatar billede ladyhawke Novice
13. juli 2003 - 23:33 #1
Er objektet ikke defineret via/i en klasse?

I så fald kan du lave definitionen i en headerfil og inkludere dén...
Avatar billede arne_v Ekspert
13. juli 2003 - 23:35 #2
Ja selvfølgelig er det muligt.

Hvis du laver en header fil med:

extern MinKlasse *mitobjekt;

og i en enkelt cpp fil laver:

MinKlasse *mitobjekt;

og ned i koden:

mitobjekt = new MinKlasse(123, "abc");

så kan alle de cpp filer der inkluderer header-filen bruge

mitobjekt->metodeditogdat();
Avatar billede ladyhawke Novice
13. juli 2003 - 23:36 #3
:)
Avatar billede ladyhawke Novice
13. juli 2003 - 23:36 #4
som vanlig hurtig på aftrækkeren med et godt svar...
Avatar billede arne_v Ekspert
13. juli 2003 - 23:37 #5
En kønnere og mere objekt orienetert måde er imidlertid at
lave en Singleton (et såkaldt GoF pattern).

Hvis du er intereseret kan jeg godt forklare lidt nærmere om det.
Avatar billede tycho Nybegynder
13. juli 2003 - 23:39 #6
Hvis du vil, så er jeg da lutter øre :).
Men ellers, tak for det hurtige svar.
Avatar billede arne_v Ekspert
13. juli 2003 - 23:41 #7
Ideen er at man ved at lave en private constructor og en static
getInstance metode kan sikre sig at der kun oprettes en instans
af klassen.

Et link som ser rimelit godt ud:

http://www.codeproject.com/cpp/singletonrvs.asp
Avatar billede arne_v Ekspert
13. juli 2003 - 23:45 #8
Avatar billede tycho Nybegynder
13. juli 2003 - 23:47 #9
tak for links'ne, men jeg tror nu at det er en smule for advanceret for mit vedkommende, og den første metode ser også ud til at fungere udemærket.
Så tak for hjælpen.
Avatar billede arne_v Ekspert
14. juli 2003 - 00:00 #10
Et hjemmelavet eksempel:

#include <cstdlib>
#include <iostream>

using namespace std;

class Counter
{
  private:
      int n;
      static Counter *instance;
      Counter();
  public:
      static Counter *getInstance();
      void increment();
      int get();
};

Counter *Counter::instance = NULL;

Counter *Counter::getInstance()
{
  if(instance==NULL)
  {
      instance = new Counter();
  }
  return instance;
}

Counter::Counter()
{
  n = 0;
}

void Counter::increment()
{
  n++;
}

int Counter::get()
{
  return n;
}


int main()
{
  Counter::getInstance()->increment();
  Counter::getInstance()->increment();
  Counter::getInstance()->increment();
  cout << Counter::getInstance()->get() << endl;
  return 0;
}
Avatar billede tycho Nybegynder
14. juli 2003 - 00:06 #11
Jeg tror jeg forstår hvordan det fungerer, dog kan jeg ikke se hvordan det skulle kunne gøre objekter globale.
Som du har lavet den der, fungerer den jo som en almindelig klasse.
Avatar billede tycho Nybegynder
14. juli 2003 - 00:18 #12
Forresten.
Jeg har prøvet dit første eksempel, og ved at oprette *mitObjekt som ekstern i en h-fil, inkluderer den i main.cpp og definere den som minKlasse *mitObjekt og mitObjekt = new minKlasse, og så referere til den i en tredje cpp-fil (headeren er inkluderet og jeg benytter "->" ), så får jeg en "unresolved external symbol" fejl. Kunne du give et eksempel på hvordan jeg benytter den i praksis (jeg har vist ikke forstået det helt)?
Avatar billede arne_v Ekspert
14. juli 2003 - 07:13 #13
Re singleton - jo fordi enhver klasse der har inkluderet en header
fil med definitionen af Counter kan bruger Counter::getInstance og
få den samme instans.
Avatar billede arne_v Ekspert
14. juli 2003 - 07:26 #14
Re eksempel:

eks.h
-----

#ifndef EKS_H
#define EKS_H

class MinKlasse {
  public:
      MinKlasse();
      void hello();
};

extern MinKlasse *mitobjekt;

#endif

eksmain.cpp
------------

#include "eks.h"
MinKlasse *mitobjekt;

void test();

int main()
{
  mitobjekt = new MinKlasse();
  mitobjekt->hello();
  test();
  return 0;
}

ekstest.cpp
-----------

#include "eks.h"

void test()
{
  mitobjekt->hello();
}

eks.cpp
-------

#include <iostream>

using namespace std;

#include "eks.h"

MinKlasse::MinKlasse()
{
}

void MinKlasse::hello()
{
  cout << "Hello" << endl;
}
Avatar billede arne_v Ekspert
14. juli 2003 - 07:27 #15
Man skal naturligvis sørge for at få linket alle stumperne
med ind.

mingw g++:

g++ eksmain.cpp ekstest.cpp eks.cpp -o eksmain.exe

MS VC++ 6 (command line mode):

cl -GX  eksmain.cpp ekstest.cpp eks.cpp
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