Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Vererbungs-Schlamassel

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 <
000
27.09.2006, 12:58 Uhr
Yadgar



High!

MemoryBlock ist eine Klasse für char-formatierte Speicherbereiche:


C++:
class MemoryBlock
{
  public:
    /* diverse Methoden */
    static int upper_limit;
    static void setLimit(int);

  protected:
    int mSize; // Größe des Speicherbereiches
    char* mWert; // Zeiger auf Speicherbereich
};



Von MemoryBlock erbt TypedMemoryBlock protected:


C++:
class TypedMemoryBlock : protected MemoryBlock
{
  public:
  /*diverse Methoden*/
  private
  /*diverse Hilfsmethoden, aber keine Datenmitglieder, da schon in MemoryBlock enthalten */    

};  



Schließlich erbt wiederum FixedArray von TypedMemoryBlock, diesmal public:


C++:
class FixedArray : public TypedMemoryBlock
{
  public:
  /* jede Menge Funktionen */
  private:
    static int upper_limit;                                // obere Grenze für Dimension eines FixedArray-Objektes,
                                                           // wird mittels statischer Funktion setLimit gesetzt
};



FixedArray hat (unter anderem) einen Allgemeinen Konstruktor:


C++:
FixedArray::FixedArray(int aD)
: TypedMemoryBlock(aD)
{
  if (aD < 0 || aD > upper_limit)
  {
    if (aD > upper_limit)
    {
      cerr << "Gew" << (char)132 << "hlte Feldgr" << (char)148 << (char)225 << "e zu hoch!" << endl;
    }
    if (aD < 0)
    {
      cerr << "Felder k" << (char)148 << "nnen keine negative Dimension haben!" << endl;
    }
    cerr << "W" << (char)132 << "hlen Sie bitte einen Wert zwischen 0 und " << upper_limit << "." << endl;
    exit (1);
  }
  mWert = new(nothrow) reinterpret_cast<char*>(int[aD]);
  if (mWert==0)
  {
    cerr << "konnte " << mDim << " Elemente nicht allokieren!" << endl;
    exit(1);
  }
}



Jetzt sollte ja eigentlich dieser Konstruktor MemoryBlock::mWert verwenden können, da es in FixedArray entsprechend der Vererbungsregeln protected ist.

Wieso bekomme ich dann für die Zeile
mWert = new(nothrow) reinterpret_cast<char*>(int[aD]);

die Fehlermeldungen
expected identifier before "reinterpret_cast"
und
expected `;' before "reinterpret_cast" ?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.09.2006, 15:27 Uhr
(un)wissender
Niveauwart


Für std::nothrow den Header <new> einbinden.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 27.09.2006 um 15:29 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.09.2006, 15:59 Uhr
Yadgar



High!


Zitat von (un)wissender:
Für std::nothrow den Header <new> einbinden.


Oder andersrum: statt mWert = new(nothrow) reinterpret_cast<char*>(int[aD]);
einfach mWert = reinterpret_cast<char*> (new(nothrow) (int[aD])); schreiben!

So hat es bei mir jedenfalls funktioniert...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.09.2006, 09:39 Uhr
(un)wissender
Niveauwart


Nein, für nothrow muss immer <new> eingebunden werden. Entweder direkt oder indirekt über andere Header.

Ich denke die ganze Anweisung

C++:
reinterpret_cast<char*> (new(nothrow) (int[aD]))


ist sehr gefärlich. Solltest du besser nicht tun.

Mach es so

C++:
int aD = 3;
char * p1 = new (std::nothrow) char [aD * sizeof(int)];
if(!p1)
{
     std::cout << "Nicht erfolgreich\n";
}    
delete [] p1;



Ansonsten besser std::string oder std::vector nehmen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.09.2006, 20:21 Uhr
0xdeadbeef
Gott
(Operator)


Davon abgesehen solltest du dir schleunigst abgewöhnen, in C++-Code exit zu benutzen. Wenn du unbedingt mit Fehlercode rauswillst, mach etwas wie

C++:
struct uncatchable { };

// ...

throw uncatchable();


Das gibt dem Programm die Möglichkeit, eventuell noch benutzte resourcen sinnvoll freizugeben. Spätestens, wenn du mit Semaphoren arbeitest, fliegt dir der Kram sonst um die Ohren - und aller Wahrscheinlichkeit nach schon lange vorher.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: