Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Fehlermeldung bei Versuch auf private Variable zuzugreifen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
07.11.2003, 17:07 Uhr
~Gast
Gast


Bin gerade dabei mich in Klassen einzuarbeiten. Leider scheine ich irgendwas schon bei diesem einfachen Beispiel (Klasse mit zwei Funktionen: 1. erhöht private Variable um 1 2. gibt diese zurück). Sobald ich versuche die Variable zu erhöhen bekomme ich ne Fehlermeldung EAccessViolation. Hier mein Code:
Header:

C++:
#ifndef TestklasseH
#define TestklasseH
class Testklasse
{
public:
  Testklasse();
  void erhoeheZaehler();
  int Ausgabe();

private:
  int Zaehler;
};
#endif


C++

C++:
#include "Testklasse.h"
void Testklasse::erhoeheZaehler()
{
Zaehler++;
}

int Testklasse::Ausgabe()
{
return Zaehler;
}
Testklasse::Testklasse()
{
Zaehler=10;
}



Aufrufen tue ich das ganze (aus ner einfachen FormAnwendung)mit:

C++:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Testklasse* test;
  test->erhoeheZaehler();
  Edit1->Text=IntToStr(test->Ausgabe());
}



Was ist falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.11.2003, 17:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Testklasse* test; konstruiert nicht ein object der klasse test sondern du hast lediglich ein Testklasse pointer;

entweder so

C++:
Testklasse* test;
test = new Testklasse(......ggf konstruktorkrempel);

delete test;  // am ende nicht vergessen den speicher wieder freizugeben



oder du legst das object direkt an (das würde ich empfehlen)

C++:
Testklasse test(......ggf konstruktorkrempel);


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2003, 21:09 Uhr
~Gast
Gast


Danke daran lag es. Hab schon was Neues: Wo muss/kann ich eine Konstante erstellen? Hab probiert direkt nach private: const int Faktor=2; zu erstellen doch erhalte ich da die Meldung das ich das Klassenelement hier nicht initialisieren kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.11.2003, 11:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


initialisieren kannst du im konstruktor. Dafür ist der eigentlich auch gedacht..
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.11.2003, 15:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Eine Konstante ist aber besser als static zu deklarieren:

C++:
class Klasse
{
  static const int eine_konstante = 4711;
  ...
};


Zwar geht das auch in der initialisiererliste des Constructors (dann nicht static), allerdings: wozu Speicher veschwenden?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.11.2003, 15:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
warum wird sonst speicher verwendet. Leuchtet mir nicht ein es sei denn du meinst wenn man mehrere Objecte einer Klasse hat.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.11.2003, 16:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, ich hatte mehrere Instanzen vor Augen. Tatsächlich ist das mit dem Speicher noch nicht mal das Hauptproblem: die Variante mit dem ctor birgt eben die Gefahr, daß man sich auch mal vertippen kann:

C++:
class Klasse
{
    const int Konstante;
public:
    Klasse() :Konstante(4711) {}
    Klasse(std::string) :Konstante(4711) {}
    Klasse(int) :Konstante(47111) {}
};


... finde da mal später raus, wo der Hund begraben liegt...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.11.2003, 16:06 Uhr
~Gast
Gast


Achso geht das

Achja hier ist noch ein Speicherproblem:


C++:
void MeineKlasse::SetzeNeuenPfad(char* alterpfad)
{
String NeuerPfad="einganzlangerString";
  StrCopy(alterpfad,NeuerPfad.c_str());
}



Wenn nun mein NeuerPfad mehr Zeichen beinhaltet als der altepfad bekomme ich ein EAccessViolation. Gibt es ne Möglichkeit diese zu umgehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.11.2003, 16:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


am besten entweder gleich ne std::string verwenden oder einen buffer nehmen der hinreichend gross ist.
wobei das bestimmt in deinem fall auch nicht sinnvoll ist den Pfad mit zu übergeben. der ist bestimmt besser als membervariable aufgehoben.
wenn du den aufwand nicht scheuest könntest du bei jeder pfadänderung auch neuen speicher anfordern und den alten freigeben
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.11.2003, 16:16 Uhr
~Gast
Gast


Es geht dabei eigentlich nur darum, das jemand die Funktion direkt aufruft und ich für den Rückgabewert (heißt das eigentlich so wenn man dafür die Aufrufparameter nutzt?) eben den Aufrufparameter nutzen soll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: