C++ GUI software Probleme mit Klassenzugriffen

Wolly300

Lieutenant
Registriert
Mai 2014
Beiträge
514
Hallo zusammen,

ich programmiere gerade ein GUI Programm mit aktuell 3 Klassen

Operation (für Berechnungen und globale Variablen)
MainForm (für das man Hauptfenster)
Farbmixtabelle (ein 2. Windows form das mit einem Button in MainForm aufgeht)

Die main() ist in der Operation klasse und erstellt als erstes ein neues Operation Object, das dann mit an MainForm und Farbmixtabelle übergeben werden soll.

Dabei treten aber entscheidende Probleme auf:

C++:
#ifndef Operation_H
#define Operation_H
#include "MainForm.h"
#include "Farbmixtabelle.h"

#include <string>
#include <array>

Operation.h

class Operation
{
    public:
        Operation();
        void showFarbmix();
        int output();
        int comport();

    private:
};

#endif

Operation.cpp

C++:
int Farbmixtabelle_Value[32][16];

    Operation::Operation()
    {
        for (int i = 0; i < 32; i++) {
            for (int x = 0; x < 16; x++) {
                if (x < 16) {
                    if (i == x && i <= 16) {
                        Farbmixtabelle_Value[i][x] = 20;
                    }
                    else {
                        Farbmixtabelle_Value[i][x] = 0;
                    }
                }
                else {

                }
            }
        }   
    }

//...

    void main(array<String^>^ arg) {
        Operation oper;

        //CISGUI::Farbmixtabelle ^ Farbmix = gcnew CISGUI::Farbmixtabelle;
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false);
        CISGUI::MainForm form(&oper);          //"CISGUI"::MainForm: Die Klasse hat keinen Kopierkonstruktor
        Application::Run(%form);
    }

MainForm.h

C++:
public ref class MainForm : public System::Windows::Forms::Form
    {

    public:

        MainForm(Operation& op)            // Syntaxfehler: Bezeichner "Operation"
            //:oper(op)     
        {

            InitializeComponent();


            if (op.output() == 20) {             // "op" nichtdeklarierter Bezeichner
                this->label_middle_left_header->Text = "Yes";
            }
            else {
                this->label_middle_left_header->Text = "No";
            }   

        }
// ...

Ich bin jetzt leider schon ziemlich am Ende mit meinem Latein und auch mein Buch hilft mir gerade nicht weiter. In C# habe ich das Projekt schon einmal erfolgreich durchgeführt, hier habe ich aber so meine Probleme.

Danke für eure Hilfe.
 
Nur kurz überflogen, aber wenn ich das richtig sehe ist Operation nicht in MainForm deklariert, und du brauchst ne forward declaration da Operation auch MainForm braucht.

Klasse Operation in MainForm.h mit
Code:
class Operation;
deklarieren, und die Klassendefinition in eine MainForm.cpp verschieben, die dann include für Operation.h hat.

Edit: Angenommen der erste Codeblock ist Operation.h
 
  • Gefällt mir
Reaktionen: Revan1710
Erstmal aus Interesse: Ist das ein C++ Projekt für Windows mit Visual Studio oder was nutzt du für deine GUI?

Operation.h:
Was soll Operation.h in Zeile 9 bewirken?

Operation.cpp:
  • Du hast ein globales int-Array Farbmixtabelle_Value definiert, das du bei jeder neuen Instanz von Operation im Konstruktor erneut initialisierst. Dafür würde ich also eine Funktion schreiben, die du einmal aufrufst am Anfang von main() bspw.
  • Zeile 30: Du willst vermutlich hier einen überladenen Konstruktor für MainForm aufrufen, den du aber garnicht definiert hast (s. unten)
  • Zeile 31: Ist das hier wirklich ein % und kein & ?

MainForm.h:
Die Klasse Operation ist nicht bekannt, also musst du Operation vorwärts deklarien (@coolmodi war schneller) oder du ordnest das anders an: Operation.h in MainForm.h inkludieren und deine main() extra in eine main.cpp packen, in der du nur MainForm.h anziehst.
Dann definierst du zusätzlich noch einen überladenen Konstruktor, mit dem du auf eine Operation-Instanz verweist, also z.B. :


Code:
// MainForm.h

#include Operation.h

public ref class MainForm : public System::Windows::Forms::Form
{
public:
    MainForm(); // Default-Konstruktor
    MainForm(Operation *op); // überladener Konstruktor

private:
    Operation *m_op;
};


// MainForm.cpp

#include MainForm.h

MainForm::MainForm() : m_op(NULL)
{
    InitializeComponent();
    
    // Es gibt kein Operation-Objekt, könntest du dir aber auch hier erzeugen
    // mit: m_op = new Operation();
}
    
MainForm::MainForm(Operation *op) : m_op(op)
{
    InitializeComponent();

    if (m_op != NULL)
    {
        if (m_op->output() == 20)
            this->label_middle_left_header->Text = "Yes";
        else
            this->label_middle_left_header->Text = "No";
    }
    else
    {
        // Error-Message
    }
}

// main.cpp

#include MainForm.h

void main(array<String^>^ arg)
 {
        Operation *oper = new Operation();

        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false);
        CISGUI::MainForm form(oper)
        Application::Run(%form);
 }
 
Zurück
Oben