Avatar billede netro Nybegynder
12. november 2004 - 01:12 Der er 33 kommentarer og
1 løsning

Statisk variabel

Følgende fungerer godt nok:

class Z
{
  public:
    Z();
    static String abc;
};

Z::Z()
{
  String abc="blabla";
}

- men det gør det ikke, når jeg vil hente værdien af abc fra et andet scope (hvadenten det er fra metoder i samme klasse eller en anden). Jeg har husket den globale res.op.
Avatar billede bertelbrander Novice
12. november 2004 - 01:41 #1
Jeg er ikke sikker på at jeg forstår spørgsmålet, dette ser ud til at virke:

#include <string>
#include <iostream>

class Class
{
public:
  Class();
  static std::string abc;
  void X();
};

Class::Class()
{
  abc = "Peter";
}

void Class::X()
{
  std::cout << abc << std::endl;
}

int main()
{
  std::cout << "Before: " << Class::abc << std::endl;
  Class cl;
  std::cout << "After: " << Class::abc << std::endl;
}

std::string Class::abc;

Du skal ikke skrive "String abc =" i Z::Z(), kun "abc ="
Avatar billede netro Nybegynder
12. november 2004 - 01:49 #2
Til din sidste kommentar: Det virker glimrende, hvis jeg skriver String abc. Undlader jeg String, får jeg fejl.

Jeg prøver lige dit forslag.

Det jeg vil, er sådan set bare at sætte værdien af en variabel (dog helst konstant, da den ikke skal ændres) i en metode. Denne variabel/konstant vil jeg så have adgang til globalt.
Avatar billede bertelbrander Novice
12. november 2004 - 02:03 #3
Hvis det blot skal være en const:
#include <string>
#include <iostream>

class Class
{
public:
  Class() {}
  static const std::string abc;
};

int main()
{
  std::cout << "Global: " << Class::abc << std::endl;
}

const std::string Class::abc = "Whatever";

Hvad er en String ? Hvilken kompiler?
Avatar billede netro Nybegynder
12. november 2004 - 02:07 #4
Jeg bruger C++ Builder 5.

Jeg forstår ikke helt, hvad std gør i din cout. Hvis jeg bare vil have overført værdien af abc til en variabel i main() - hvordan ser det så ud?
Avatar billede bertelbrander Novice
12. november 2004 - 02:10 #5
std::string X = Class::abc;
  std::cout << X << std::endl;
  Class C;
  std::string Y = C.abc;
  std::cout << Y << std::endl;

std:: er fordi cout, endl og string er i namespace std, og jeg ikke har en using namespace std, du kan blot ignorere dem.
Avatar billede netro Nybegynder
12. november 2004 - 02:20 #6
Nå ja, det er rigtigt.

Men jeg får samme Linker error som før, når jeg vil hente konstantens værdi et andet sted fra med:

String X = Class::abc;
Avatar billede netro Nybegynder
12. november 2004 - 02:24 #7
Jeg kan ikke engang hente abc fra en anden metode i klassen Class.
Avatar billede netro Nybegynder
12. november 2004 - 02:24 #8
- med String X = abc;
Avatar billede netro Nybegynder
12. november 2004 - 04:18 #9
Nu har jeg fået præciseret problemet lidt. Det fungerer nemlig kun på følgende måde:

class Z
{
  public:
    static const int abc=45;
    Z();
};

int def=Z::abc;

Men jeg ønsker jo ikke at give abc værdien i selve erklæringen og vil gerne bruge en String i stedet for en integer.
Avatar billede segmose Nybegynder
12. november 2004 - 09:48 #10
Det vigtige er dette:

std::string Class::abc;

Da static skal have en erklæring uden for klassen, at du så skal skrive.

String Class::abc;

er så en tilpasning til din compiler/options.
Avatar billede netro Nybegynder
12. november 2004 - 15:05 #11
Jeg får en redeklarationsfejl med følgende, men det er måske forkert?

class Class
{
  public:
    static const String abc;
    Class();
};

String Class::abc;

Class::Class()
{
  const String abc="45";
}

String def=Class::abc;
Avatar billede netro Nybegynder
12. november 2004 - 15:10 #12
Alle fejl forsvinder, hvis jeg sætter "const" foran "String Class::abc;".

Men når jeg så aflæser værdien af abc (nederse linie) er den bare tom!?
Avatar billede netro Nybegynder
12. november 2004 - 15:18 #13
Det virker som om, at abc slet ikke får tildelt værdien i constructoren, men som sagt kommer der ingen fejl eller advarsler. Det forstår jeg ikke...
Avatar billede arne_v Ekspert
12. november 2004 - 19:47 #14
Class::Class()
{
  const String abc="45";
}

giver en lokal variabel i constructorne værdien "45"
Avatar billede arne_v Ekspert
12. november 2004 - 19:47 #15
Du mener nok:

Class::Class()
{
  abc="45";
}
Avatar billede netro Nybegynder
13. november 2004 - 02:04 #16
Hej Arne,

Hvis jeg undlader "const String" i constructoren, får jeg fejlen:

Could not find a match for 'AnsiString::operator=(char *)'
Avatar billede bertelbrander Novice
13. november 2004 - 02:14 #17
Når du har en "static const String abc;" i din class, kan du ikke give den en værdi i konstructoren, du skal give den en værdi når du erklærer variablen:

const String Class::abc = "45";
Avatar billede bertelbrander Novice
13. november 2004 - 02:17 #18
Du kan fjerne const, så kan du give den en værdi i konstruktoren, men så har den først værden når nogen kalder konstructoren (dvs laver et object af typen Class).

Den fejl besked du får fra Borland er lidt misvisende.
Avatar billede netro Nybegynder
13. november 2004 - 02:19 #19
Okay, men jeg finder først værdien til abc i en metode til klassen. Det er til et login-system, hvor jeg vil sætte abc til brugerens navn, når vedkommende logger ind.
Avatar billede bertelbrander Novice
13. november 2004 - 02:23 #20
I så fald skal den ikke være const.

Den skal vist heller ikke være static, static members deles af alle instanser af klassen, og alle brugere har nok ikke det samme navn.

Det skal nok blot være en almindelig public member (eller en provate med Getxxx() og Setxxx())
Avatar billede netro Nybegynder
13. november 2004 - 02:33 #21
Ja, men hvis jeg forsøger at hente denne offentlige variabel med:

Class c;
String def=c.Hent_abc();

- så får jeg jo blot returneret noget volapyk, da objektet c ikke har tildelt en værdi til abc?
Avatar billede bertelbrander Novice
13. november 2004 - 02:44 #22
Hvor skal c.Hent_abc() få værdien fra ?
Avatar billede netro Nybegynder
13. november 2004 - 02:49 #23
Hmm... det er ikke så nemt at forklare, selvom det nok er ret simpelt. Jeg prøver lige at tage det konkrete tilfælde.

Når en bruger logger ind, kalder jeg en metode i klasse Loginkontrol fra et andet scope sådan:

Loginkontrol lk;
lk.Tjek_Login(String User, String Pwd);

I klassen Loginkontrol vil jeg så sætte en variabel/konstant, der indeholder brugerens navn (User).

Denne vil jeg kunne tilgå overalt herefter. Kan du se, hvor jeg vil hen?
Avatar billede bertelbrander Novice
13. november 2004 - 02:53 #24
Er Loginkontrol en class for alle brugere eller for en bruger?

Hvis det er én bruger skal den vel bare gemme brugernavn i Tjek_Login.
Hvis Loginkontrol er for alle brugere er den vel nødt til at have en liste med alle brugeres navne. Eller en member der angiver den "nuværende" bruger (ikke kønt).
Avatar billede netro Nybegynder
13. november 2004 - 02:58 #25
Jeg er ikke helt sikker på, jeg forstår dit spørgsmål. Men hvis jeg gør, så er det kun for én bruger. Jeg kan dog ikke se, hvordan jeg skal hente værdien uden for denne klasse, hvis jeg blot sætter en varibael i klassen til den pågældende værdi.
Avatar billede bertelbrander Novice
13. november 2004 - 03:08 #26
#include <iostream>
#include <string>
using namespace std;

class Loginkontrol
{
public:
  bool Tjek_Login(string aUserName, string aPassWord)
  {
      UserName = aUserName;
      return 0;
  }
  string UserName;
};

int main()
{
  Loginkontrol lk;
  lk.Tjek_Login("Ole", "Pss");
  string S = lk.UserName;
  cout << "Name: " << S << std::endl;
}
Avatar billede netro Nybegynder
13. november 2004 - 03:12 #27
Tak for al din tid. Den er jeg med på. Men hvis vi holder fast i det eksempel - hvordan vil du så hente Username uden for main? Altså fra fx.:

void __fastcall TForm::xxx(TObject *Sender)
{
Username = ?
}
Avatar billede bertelbrander Novice
13. november 2004 - 03:16 #28
Man er nødt til at kende det object for hvilket man vil have username.

Så du bliv nødt til at lade xxx kende objektet, det kan gøres ved at flytte dit Loginkontrol objekt ud i dit TForm object, eller ved at lave dit Loginkontrol object om til en global variabel.
Avatar billede netro Nybegynder
13. november 2004 - 03:20 #29
Det var lige præcis det, jeg ville frem til. Jeg tror bedst, jeg kan lide løsning nr. 2. Kan du vise mig, hvordan det vil se ud med udgangsounkt i ovenstående to eksempler?
Avatar billede bertelbrander Novice
13. november 2004 - 03:24 #30
Du flytter linien "Loginkontrol lk;" ud til toppen af den cpp fil hvorfra du skal tilgå den.

Hvis du skal bruge den i mere end en cpp fil skal du kun have den i en cpp fil, og så lave en: "extern Loginkontrol lk;" i en headerfil, sansynligvis den hvor du har defineret class'en.
Avatar billede netro Nybegynder
13. november 2004 - 04:02 #31
Nå, der lukkede Eksperten ned for en stund.

Det fungerer perfekt nu langt om længe, og løsningen var jo ikke ligefrem kompliceret.

Jeg siger 1000 tak for din (jeres) hjælp.

I må gerne lægge et svar begge to.
Avatar billede bertelbrander Novice
13. november 2004 - 14:47 #32
Jeg samler ikke på point.
Avatar billede arne_v Ekspert
13. november 2004 - 21:32 #33
det gør jeg - men jeg ved ikke rigtigt om jeg har fortjent nogen her
Avatar billede netro Nybegynder
14. november 2004 - 16:19 #34
Jeg får sikkert brug for din hjælp en anden gang, så vær så god ;)
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