Initialisierung einer CBitmap



  • Hi,

    ich würde gerne im Konstruktor einer Klasse ein CBitmap-Member initialisieren und bin ein wenig ratlos, wie das korrekt erfolgen sollte.

    Einfach per Zuweisung geht es ja nicht:

    //A.h
    class A
    {
    public:
        A(const CBitmap& pic);
    private:
        CBitmap m_pic;
    }
    
    //A.cpp
    A::A(const CBitmap& pic)
    {
        m_pic = pic;
    }
    

    Ich habe es folgendermaßen probiert:

    //A.h
    class A
    {
    public:
        A(CBitmap pic);
    private:
        CBitmap m_pic;
    }
    
    //A.cpp
    A::A(CBitmap pic)
    {
        BITMAP temp;
        pic.GetBitmap(&temp);
        m_pic.CreateBitmapIndirect(&temp);
    }
    

    Allerdings gefällt mir das nicht sonderlich:
    1. Muss es so "um drei Ecken" sein?
    2. Nach meinem Verständnis würde ich eigentlich lieber

    A::A(const CBitmap& pic)
    

    schreiben (da kein Grunddatentyp), allerdings ist CBitmap::GetBitmap() offensichtlich nicht const und mein Compiler meckert dann entsprechend. Verzichte ich dann halt auf const &?

    Wie sieht denn eine saubere Lösung aus? Oder ist das in Ordnung so???

    Danke schonmal vorab!



  • ...ist das so schlecht, dass es keinen Kommentar wert ist? Macht man das vielleicht tatsächlich so?

    Vielleicht noch einmal die Aufgabenstellung.
    Eine Klasse hat ein CBitmpap-Member, das ich mit einer dem Konstruktor übergebenen Bitmap initialisieren möchte.

    Würde mich über ein paar Tips freuen!



  • class A
    {
    public:
        A(const CBitmap& pic);
    private:
        CBitmap m_pic;
    }
    
    //A.cpp
    A::A(const CBitmap& pic) : m_pic(pic)
    {
    }
    

    habs nicht getestet ... aber normal sollte das so gehen ...

    Edit
    Sonnst sag mal die genaue Fehlermeldung die der dann bringt ...


  • Administrator

    Es gibt in CBitmap kein op= und kein Konstruktor, welcher ein CBitmap erwartet, also ist deine Lösung wohl schon korrekt. Man kann natürlich ein paar Dinge anderst schreiben. Wenn du z.b. dem User ganz klar sagen möchtest, dass du nichts am Bitmap, welches er übergibt veränderst, dann mache es doch so:

    A::A(const HBITMAP& refhBitmap)
    {
        m_pic.CreateBitmapIndirect(&refhBitmap)
    }
    

    Da CBitmap sogar ein (HBITMAP) operator hat, könntest du womöglich sogar dem Konstruktor dann gleich ein CBitmap übergeben. Er holt sich dann gleich das HBITMAP selber.

    @(D)Evil
    Problem ist, CBitmap hat kein Konstruktor, welches ein CBitmap erwartet, so dumm es auch ist ^^

    Grüssli



  • Mit Initialisierungsliste habe ich es auch probiert, das funktioniert aber genausowenig wie die Verwendung des Zuweisungsoperators.
    Mit dem Wortlaut der Fehlermeldung kann ich aktuell nicht dienen, allerdings kriege ich sowohl im Fall der Initialisierungsliste als auch bei Verwendung des Zuweisungsoperators einen "error c2248: cannot access private member of ..."
    (mit Verweisen auf CGdiObject bzw. CObject).

    Das habe ich dazu gefunden:
    http://msdn2.microsoft.com/en-us/library/tsbce2bh(vs.71).aspx

    Für mich sieht es so aus als ob sowohl der Zuweisungsoperator als auch der Konstruktor von CObject private sind...

    Exakte Fehlermeldung kann ich ggf. später nachreichen.



  • @Dravere
    Danke für den Tip, so habe ich tatsächlich zumindest mein gewünschtes const & 🙂

    Werde es mal probieren.


Anmelden zum Antworten