Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Array als abgeleitete Klasse?

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
23.07.2006, 11:30 Uhr
Yadgar



High!

Um nicht immer nur Lehrbuch-Übungsbeispiele durchzuackern, sondern auch mal selbst ein längeres Projekt zu entwickeln, habe ich vor, ein (vorerst noch eher kleines) Bildbearbeitungsprogramm für die Linux- bzw. DOS-Konsole zu programmieren (GUI mit Maussteuerung ist für mich im Moment noch völlig utopisch, vielleicht nächstes Jahr...).

Als Klassen habe ich eine Basisklasse für Pixel:


C++:
class Pixel
{
   private:
      unsigned char b;   // wozu mehr als 1 Byte verschwenden?
      unsigned char g;   // in TGA-Files ist die Reihenfolge der Farbkomponenten umgekehrt!
      unsigned char r;
      unsigned char blue(void) { return b; }      
      unsigned char green(void) { return g; }
      unsigned char red(void) { return r; }
}



Public-Methoden gibt es (vorerst) keine in "Pixel", da ich erst einmal Bearbeitungsfunktionen programmieren will, die einheitlich auf alle Pixel des Bildes wirken; dazu bräuchte ich eine Klasse "Bild" als Array von "Pixel"-Objekten, die von "Pixel" abgeleitet sein soll, damit sie auch die Methoden von "Pixel" verwenden kann.

(andernfalls müßte ich für jede Bearbeitung des gesamten Bildes eines doppelt geschachtelte Schleife in main() programmieren, das muss ja nun auch nicht sein!)

Aber ist so etwas überhaupt möglich? Kann eine abgeleitete Klasse Elemente (also Variablen) vom Typ der Grundklasse enthalten (in diesem Fall also das Pixel-Array)? Oder führt der Weg zur Lösungs meines Problems nur über "friend"?

Abgesehen davon würde eine solche abgeleitete Klasse "Bild" zwangsläufig auch b, g, und r als Einzel-Elemente übernehmen, die im Hinblick auf ein Array natürlich nutzlos wären (es sei denn, ich finde irgendeine andere Verwendung für sie - aber elegant ist das alles nicht!)...

Bis bald im Khyberspace!

Yadgar

Now playing: Via Satellit (Rheingold)
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.07.2006, 11:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hallo, abgeleitete klassen erben die variablen der Basisklasse, jedoch: private-Member können nur friends und die eigene klasse, protected können auch die abgeleiteten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.07.2006, 17:49 Uhr
Yadgar



High!


Zitat von FloSoft:
hallo, abgeleitete klassen erben die variablen der Basisklasse, jedoch: private-Member können nur friends und die eigene klasse, protected können auch die abgeleiteten.


Mit anderen Worten, in meinem Fall ist Vererbung gar nicht notwendig, es reicht, wenn ich "Pixel" und "Bild" als miteinander befreundet deklariere?

Bis bald im Khyberspace!

Yadgar

Now playing: Delta One (Synergy)
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.07.2006, 22:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
naja mit Ableitung haste ein evtl ein sinnvolleres Konstrukt, wenn eben deine Klasse die Elemente so direkt brauchen kann. Kommt auf deine Situation an. Ansonsten: Getter und Setter-Methoden public machen, und nur die member private oder protected (je nachdem was man halt braucht). friend-Konstrukte sind imho immer schlecht wartbar. (Vor allem wenn man sich in nen Code neu einliest und dann plötzlich sich denk "wtf? wie kann der auf die privaten methoden zugreifen?" und dann erst sieht das das als friend deklariert ist )

Bei "Pixel" und "Bild" ists evtl sinnvoller WENN du es eben so lässt dann mit friend.

Aber würde evtl so machen:


C++:
class Pixel
{
  public:
      unsigned char blue(void) { return b; }      
      unsigned char green(void) { return g; }
      unsigned char red(void) { return r; }
      void blue(unsigned char b) { this->b = b; };
      void green(unsigned char g) { this->g = g; };
      void red(unsigned char r) { this->r = r; };

  private:
      unsigned char b;   // wozu mehr als 1 Byte verschwenden?
      unsigned char g;   // in TGA-Files ist die Reihenfolge der Farbkomponenten umgekehrt!
      unsigned char r;
};

class Bild
{

public:
   void makemered()
   {
      for (unsigned int i = 0; i < 100; ++i)
      {
         for (unsigned int j = 0; j < 200; ++j)
         {
             bilddaten[j][i].red(255);
             bilddaten[j][i].green(0);
             bilddaten[j][i].blue(0);
         }
      }
   }

private:
   Pixel bilddaten[200][100]; // als beispiel.
};



So kann man evtl effektiver mit arbeiten, auch dann mit anderen klassen als nur mit "Bild".
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.07.2006, 23:41 Uhr
Yadgar



High!

Mein Code sieht jetzt so aus:


C++:
class Pixel
{
   friend Image;
   private:
      unsigned char b;  // da Farbwerte bei normaler 24bit-Grafik nur  
      unsigned char g;  // zwischen 0 und 255 liegen können,
      unsigned char r;  // genügt hier ein 1 Byte langer Typ
      // Private Methoden zur Angabe von Farbwerten, wegen ihrer Kürze inline
      unsigned char blue(void)
      {
         return b;
      }
      unsigned char green(void)
      {
         return g;
      }
      unsigned char red(void)
      {
         return r;
      }
      public:
         Pixel (unsigned char, unsigned char, unsigned char); // Konstruktor
};

Pixel::Pixel (unsigned char bl, unsigned char gr, unsigned char rd)
{
   b=bl;
   g=gr;
   r=rd;
}

class Image
{
      private:
         unsigned short width;
         unsigned short height;
         Pixel matrix[height][width];
      public:
         Image (unsigned short, unsigned short); // Konstruktor
     unsigned long cCount (unsigned char, unsigned char, unsigned char);
     // zählt Pixel der angegegebenen Farbe, wichtig: Farbwert-        
};       // reihenfolge ist Standard, also r, g, b!

Image::Image (unsigned short w, unsigned short h)
{
    Pixel* matrix = new Pixel[h][w];
    width=w;
    height=h;    
}

Image::unsigned long cCount (unsigned char r, unsigned char g, unsigned char b)
{
    unsigned long n=0;
    unsigned long x;
    unsigned long y;
    for (y=0; i<height; y++)
   {
      for (x=0; i<width; x++)
      {
          if ( matrix[y][x].blue() || matrix[y][x].green() || matrix[y][x].red() ) n++;
      }
   }
   return n;
}




Hmmm, ich frage mich, ob ich die Speicherplatz-Allokation im Konstruktor von "Image" richtig geschrieben habe... müßte es bei einem zweidimensionalen Feld nicht Pixel* matrix[]... oder so ähnlich heißen? Na ja, ich erfahre es ja spätestens morgen abend, wenn ich zur Implementierung komme...

Bis bald im Khyberspace!

Yadgar

Now playing: Magnetic Fields III, live 1982 Shanghai (Jean-Michel Jarre)
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.07.2006, 10:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi, das ist falsch. du erzeugst ne lokale variable matrix im konstruktor.


C++:
class ...
{
  Pixel *matrix;
}

Image::Image(...)
{
  matrix = new Pixel[width*height]; // <-- und dann halt matrix[y*(height) +x]
}


--
class God : public ChuckNorris { };
 
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: