wzajemne wywołania metod z 2 klas

0

Piszę program, są tam 2 klasy: Form1 i Core.
Metody z klasy Form1 (np buttonClick) wywołują metody z klasy Core - implementacja wywołania w Form1.cpp
Chciałbym też, żeby jednocześnie metody z klasy Core mogły zadziałać na formatce (Form1),
Core.cpp

#include "StdAfx.h"
#include "Core.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

data_generator_2::Core::Core(void)
{
 //constructor

}

System::Void data_generator_2::Core::malloc_tables(data_generator_2::Form1^ f1)
{
  //funkcje standardowe bibliotek języka C   


   f1->textBox1->AppendText(String::Format("{0}   Zaalokowano pamięć",System::DateTime::UtcNow));



   //data_generator_2::Form1::textBox1->AppendText(String::Format("{0}   Zaalokowano pamięć",System::DateTime::UtcNow));
}
System::Void data_generator_2::Core::free_tables(void)
{
    //funkcje standardowe bibliotek języka C   
} 

Core.h

#pragma once
#include "stdafx.h"

namespace data_generator_2 {

   using namespace System;
   using namespace System::ComponentModel;
   using namespace System::Collections;
   using namespace System::Windows::Forms;
   using namespace System::Data;
   using namespace System::Drawing;



struct miasta_
{
   char *nazwa;
   int wielkosc;
};

public ref class Core
{
//rozmiary tablic znaków
public: int s_imiona;
public: int s_nazwiska;
public: int s_ulice;
public: int s_miasta;
public: int s_rodzaje;
public: int s_producenci;
public: int s_word1;
public: int s_word2;
public: int s_word3;

//tablice znaków
public: char **imiona_m;
public: char **imiona_k;
public: char **nazwiska_m;
public: char **nazwiska_k;
public: char **ulice;
public: struct miasta_ *miasta;
public: char **rodzaje;
public: char **producenci;

//METODY
public:Core(void);
public: System::Void malloc_tables(data_generator_2::Form1^ f1);
public: System::Void free_tables(void);



};//class


}//namespace 

Form1.cpp

 #include "StdAfx.h"
#include "Form1.h"

System::Void data_generator_2::Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
   this->cor->malloc_tables(this);
   this->cor->free_tables();
}//GENERUJ
System::Void data_generator_2::Form1::button2_Click(System::Object^  sender, System::EventArgs^  e) 
{
   this->textBox1->Clear();             
}//clear log

Form1.h

#pragma once
#include "stdafx.h"
#include "Core.h"


namespace data_generator_2 {

   using namespace System;
   using namespace System::ComponentModel;
   using namespace System::Collections;
   using namespace System::Windows::Forms;
   using namespace System::Data;
   using namespace System::Drawing;
   using namespace data_generator_2;

   /// <summary>
   /// Summary for Form1
   ///
   /// WARNING: If you change the name of this class, you will need to change the
   ///          'Resource File Name' property for the managed resource compiler tool
   ///          associated with all .resx files this class depends on.  Otherwise,
   ///          the designers will not be able to interact properly with localized
   ///          resources associated with this form.
   /// </summary>
   public ref class Form1 : public System::Windows::Forms::Form
   {
   public:
      Form1(void)
      {
         InitializeComponent();
         cor = gcnew data_generator_2::Core();
         
         //
         //TODO: Add the constructor code here
         //
      }

   protected:
      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      ~Form1()
      {
         if (components)
         {
            delete components;
         }
      }
   private: System::Windows::Forms::GroupBox^  groupBox1;
   public: System::Windows::Forms::NumericUpDown^  numericUpDown6;
   private: 
   public: System::Windows::Forms::NumericUpDown^  numericUpDown5;
   public: System::Windows::Forms::NumericUpDown^  numericUpDown4;
   public: System::Windows::Forms::NumericUpDown^  numericUpDown3;
   public: System::Windows::Forms::NumericUpDown^  numericUpDown2;
   public: System::Windows::Forms::NumericUpDown^  numericUpDown1;
   public: System::Windows::Forms::DateTimePicker^  dateTimePicker2;
   public: System::Windows::Forms::DateTimePicker^  dateTimePicker1;
   protected: 


   public:data_generator_2::Core^ cor;





   //bebechy formatki


      }
#pragma endregion
   private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e);
   public: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);
};
} 

Jak zrobić, żeby metoda Core::malloc_tables() mogła wywołać metodę f1->textBox1->AppendText() ?
powyższy kod w trakcie kompilacji krzyczy:

 (...)\Core.h(46) : error C2039: 'Form1' : is not a member of 'data_generator_2'
(...)\Core.h(46) : error C2061: syntax error : identifier 'Form1'
0

Przed deklaracją klasy Core w Core.h daj wiersz:
ref class data_generator_2::Form1;
Tak mi się wydaje bo nigdy z tym CLI nie miałem do czynienia.

0

Chciałbym też, żeby jednocześnie metody z klasy Core mogły zadziałać na formatce (Form1)

Nie należy innym klasom udostępniać formy. Prawidłowo powinno się w formie utworzyć zdarzenie (event). Kiedyś się rozpisywałem na ten temat na tym forum, poszukaj.

0

Czesc,
z CLI wprawdzie nie korzystam, ale ja zrobiłbym to tak:
-stworzyłbym klasę abstrakcyjną pt. FormManipulator, w której zawarłbym funkcję abstrakcyjną appendTextBoxText(string text)
-zrobiłbym, żeby moja forma dziedziczyła z FormManipulator oraz z normalnego Form(jak dotychczas)
-moja forma implementowałaby metodę appendTextBoxText

Teraz, zeby jakas klasa mogla manipulowac moją formą, przekazałbym jej referencję do mojej formy. Dzięki metodzie appendTextBoxText moglaby ona dodawac text do textboxa.
Pozdrawiam!

0

-zrobiłbym, żeby moja forma dziedziczyła z FormManipulator oraz z normalnego Form(jak dotychczas)

Przekładając to na wymogi C++/CLI, form manipulator musiałby być zdefiniowany jako interface class, czyli klasa czysto abstrakcyjna.

interface class FormManipulator {
  public:
     virtual void appendTextBoxText(String ^text) = 0;
};

ref class Form1 : public Form, public FormManipulator
{
  // ...
  public:
    virtual void appendTextBoxText(String ^text)
    {
        textBox1->AppendText(text);
    }
};

Przy czym w powyższym siliłem się na jak najmniej odstępstw od standardowego C++. Bardziej stylu C++/CLI będzie po prostu

interface class IFormManipulator {
   void appendTextBoxText(String ^text);
};

ref class Form1 : public Form, IFormManipulator
//...

co znaczy dokładnie to samo.

Parę objaśnień dla niewtajemniczonych:
String, ściślej System::String, to taki dotnetowy string. A raczej wstring.
Ptaszek ^ to „uchwyt” — odpowiednik gwiazdki dla typów zarządzanych (czyli dotnetowych). Uchwyty podlegają automatycznemu odśmiecaniu.
interface class — interfejs, klasa czysto abstrakcyjna. wszystkie jej metody są wirtualne, publiczne, i abstrakcyjne: dlatego można wyciąć te słowa.
ref class — typowa klasa zarządzana. główną różnicą do zwykłej jest to, że podlega GC. dla podkreślenia tego faktu stosujemy punktuator ^ zamiast *.

1 użytkowników online, w tym zalogowanych: 0, gości: 1