tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
378
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von thekiller
    thekiller thekiller ist offline Viceinator
    Registriert seit
    Dec 2004
    Ort
    Wismar
    Beiträge
    396
    Hallo Leute,

    ich hab ein Problem beim Rückgeben einer Klasse aus einer Methode heraus.

    Also es gibt eine Klasse namens CosiByteArray. Wie der Name schon sagt verwaltet diese Klasse einfach ein Array ähnlich wie QByteArray in Qt.

    Ich habe die Klasse soweit gestestet und sie scheint auch ohne Probleme zu funktionieren.

    CosiByteArray.h
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    #ifndef CosiByteArray_H
    #define CosiByteArray_H
     
    // Standard C/C++ - Headers
    #include <mem.h>
     
    // CosiFramework - Headers
    #include "CosiSimpleDataTypeDefinitions.h"
    #include "CosiExcErrMsg.h"
     
    class CosiByteArray {
        private:
            CosiByte    *m_Data;
            CosiUint64  m_Size;
     
            void    InitClass();
            void    CleanUpClass();
     
        public:
            CosiByteArray();
            ~CosiByteArray();
     
            void    SetData(CosiByte *_Data, CosiUint64 _SizeInbyte);
            void    SetData(CosiByteArray &_Instance);
            void    AppendData(CosiByte *_Data, CosiUint64 _SizeInbyte);
            void    DeleteData();
     
            CosiByte*   GetData();
            CosiUint64  GetSize();
    };
     
    #endif // CosiByteArray_H

    Beim Erstellen einer Instanz von CosiByteArray werden m_Data und m_Size im Konstruktor natürlich auf 0 gesetzt.

    CosiByteArray möchte ich nun in einer anderen Klasse von mir verwenden.

    CosiFile:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #ifndef COSIFILE_H
    #define COSIFILE_H
     
    // Standard C/C++ - Headers
    #include <stdio.h>
     
    // CosiFramework - Headers
    #include "CosiSimpleDataTypeDefinitions.h"
    #include "CosiExcErrMsg.h"
    #include "CosiByteArray.h"
     
    class CosiFile {
        private:
            FILE        *m_FileHandle;
            CosiUint64  m_FileSize;
            CosiUint64  m_FilePtrPos;
            bool        m_FlagOpen;
     
            void    InitClass();
            void    CleanUpClass();
     
        public:
            CosiFile();
            ~CosiFile();
     
            void    OpenFile(const char *_FileName);
            void    CloseFile();
     
            void            WriteData(CosiByte *_Data, CosiUint64 _Size);
            CosiByteArray   ReadData(CosiUint64 _Size);
     
            CosiUint64  GetFileSize();
     
            void    SetPosition(CosiUint64 _Position);
            CosiUint64  GetPosition();
    };
     
    #endif // COSIFILE_H

    Mein Problem tritt nun in der Methode
    Code cpp:
    1
    
    CosiByteArray   ReadData(CosiUint64 _Size);
    auf.

    Die Methode sieht folgendermaßen aus:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    CosiByteArray   CosiFile::ReadData(CosiUint64 _Size) {
        CosiByteArray DataArray;
     
        /*
            Hier passieren noch andere Operationen
        */
     
        return DataArray;
    }

    Beim Debuggen zeigt mit der QtCreator folgende Daten (siehe Screenshot)

    Warum gibt mir der Debugger zwei mal DataArray an? Und warum sind m_Data und m_Size nicht 0?

    Das Problem tritt übrigends nicht auf, wenn ich mit
    Code cpp:
    1
    
    CosiByteArray   ReadData(CosiUint64 _Size);
    z.B. void zurückgebe. Dann Gibt der Debugger nur einmal DataArray an und die Member sind auch mit 0 initialisiert.

    An der Stelle scheinen meine C++ Kenntnisse wohl nicht mehr zu reichen.
    Muss man bei CosiByteArray noch einen Konstruktor überladen oder wodran kann das liegen****

    MfG Manuel

    EDIT.: Ich hab nochmal ein Screenshot angehängt wo es ohne Probleme funktioniert.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Problem mit Rückgabetyp (Klasse)-screenie.jpg   Problem mit Rückgabetyp (Klasse)-screenie2.jpg  

    Geändert von thekiller (03.02.12 um 11:05 Uhr)
     
    OS: Win 7 Ultimate x64
    CPU: Intel Core i7 2600K (3,4GHz - 3,8 GHz)
    RAM: 4 x 8GB-DDR3 1333MHz
    Board: Asus P8Z68-V/Gen3
    GFX: Nvidia GTX580 (Palit)

    Cinema 4D R12, Photoshop CS5, Visual Studio 2010, Qt SDK, Notepad++
    blog.unlimitedengine.de
    design-projects.de

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo Manuel,

    du solltest CosiByteArray noch einen Kopierkonstruktor spendieren.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    Avatar von thekiller
    thekiller thekiller ist offline Viceinator
    Registriert seit
    Dec 2004
    Ort
    Wismar
    Beiträge
    396
    Hab ich eingebaut. Problem besteht leider weiterhin

    Code cpp:
    1
    2
    3
    4
    
    CosiByteArray::CosiByteArray(const CosiByteArray &_Instance) {
        this->InitClass();
        this->SetData(_Instance.m_Data, _Instance.m_Size);
    }
     
    OS: Win 7 Ultimate x64
    CPU: Intel Core i7 2600K (3,4GHz - 3,8 GHz)
    RAM: 4 x 8GB-DDR3 1333MHz
    Board: Asus P8Z68-V/Gen3
    GFX: Nvidia GTX580 (Palit)

    Cinema 4D R12, Photoshop CS5, Visual Studio 2010, Qt SDK, Notepad++
    blog.unlimitedengine.de
    design-projects.de

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wenn du den Kopierkostruktor überschreibst, solltest du in der Regel alle der "big three" überschreiben.

    http://en.wikipedia.org/wiki/Rule_of...programming%29

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von thekiller
    thekiller thekiller ist offline Viceinator
    Registriert seit
    Dec 2004
    Ort
    Wismar
    Beiträge
    396
    Ah ok Assignment-Operator und Copy-Constructor waren die Lösung meines Problems.
    Vielen Dank!

    MfG Manuel
     
    OS: Win 7 Ultimate x64
    CPU: Intel Core i7 2600K (3,4GHz - 3,8 GHz)
    RAM: 4 x 8GB-DDR3 1333MHz
    Board: Asus P8Z68-V/Gen3
    GFX: Nvidia GTX580 (Palit)

    Cinema 4D R12, Photoshop CS5, Visual Studio 2010, Qt SDK, Notepad++
    blog.unlimitedengine.de
    design-projects.de

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 10.06.10, 17:48
  2. Antworten: 7
    Letzter Beitrag: 26.05.08, 23:13
  3. C: string als Rückgabetyp einer Funktion
    Von paddymann im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 20.12.07, 17:35
  4. dyn. Rückgabetyp bei einer Methode
    Von chris_sit im Forum Java
    Antworten: 2
    Letzter Beitrag: 24.10.06, 12:35
  5. Struct als Rückgabetyp von MFC DLL
    Von MichiStroi im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 21.09.05, 13:58