[C++ /.NET]Odwoływanie do elementów Form z innych obiektów?

0

Otóż taki komunikat mam przy współpracy tych plików. Błąd występuje oczywiście w Form1.h.

Form1.h

#pragma once
#include <time.h>
#include <windows.h>
ref class CCenter;

namespace RCK {

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

	/// <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();
			CCenter^ Engine = gcnew CCenter(0);
			//
			//TODO: Add the constructor code here
			//
		}
itd...

Center.h

#pragma once
#include "StandsQue.h"
#include "Giver.h"
#include "StandsQue.h"
#include "Form1.h"

public ref class CCenter
{
public:
	CCenter();
	~CCenter(void);
	void AddGiver(void);
	void Work(void);
	void AddStand(System::Int32 StandsNumber);
private:
	RCK::Form1 Interfejs;
};

Center.cpp

#include "StdAfx.h"
#include "Center.h"
#include "StandsQue.h"
#include "Form1.h"

CCenter::CCenter()
{
	//Interfejs.DocStands->Items->Add("1")->SubItems->Add("Udalo sie");
}

CCenter::~CCenter(void)
{
}

void CCenter::AddGiver(void)
{
}

void CCenter::Work(void)
{
}

void CCenter::AddStand(System::Int32 StandsNumber)
{
}

Wie ktoś o co chodzi bo ja zgłupiałem...

0
#pragma once
#include <time.h>
#include <windows.h>
ref class CCenter;   //<-- mowa o tym

namespace RCK {
...

samo forward declaration nie wystarczy aby moc w pelni uzywac obiektow. kompilator po nim wie ze taka nazwa oznaza klase, ale w dalszym ciagu nic nie wie o jej zawartosci --- w szczegolnosci nie ma pojecia ze istnieje jakikolwiek kostruktor.

zamiast forward declaration daj po prostu zwyklego #include "plik_z_klasa.h"..

0

w momencie kiedy zainkluduje normalnie "Center.h" to przez krzyżowe includowanie dostaje error znowóż w CCenter że RCK namespace nie oznacza namespace itd.. i to jest problem ...

0

Form1.h:

#pragma once
#include <time.h>
#include <windows.h>

#include "Center.h"   //by moc tutaj skonstruowac gcnew Center wymagana jest PELNA definicja Center'a

namespace RCK {

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

        public ref class Form1 : public System::Windows::Forms::Form
        {
        public:
                Form1(void)
                {
                        InitializeComponent();
                        CCenter^ Engine = gcnew CCenter(0);   //ta linia wymaga PELNEGO zdefiniowania Ccenter
                }

Center.h

#pragma once
#include "StandsQue.h"
#include "Giver.h"
#include "StandsQue.h"

namespace RCK {
    ref class Form1;    //forward declaration nazwy Form1, dzieki czemu CCenter wie ze taka nazwa bedzie istniec. NIE MOZNA #include "Form1.h", gdyz ono WYMAGA aby PELNA deklaracja CCenter byla znana przed nim. dlatego..... patrz na koniec pliku
}

public ref class CCenter
{
public:
        CCenter();
        ~CCenter(void);
        void AddGiver(void);
        void Work(void);
        void AddStand(System::Int32 StandsNumber);
private:
        RCK::Form1^ Interfejs;   //zapomniales ^, wiec chcialo utworzyc wartosc, wiec wymagana byla pelna definicja Form1. zas ^ wystarczy samo forward declaration nazwy - patrz przypis na poczatku pliku
};

#include "Form1.h"
//do skompilowana Center.h wystarczyla samo forwarddecl na poczatku. oczywiscie zeby 'klienci' pliku center.h mogli uzywac zmiennej Interfejs -- trzeba uzupelnic wiedze o klasie Form1. stad include jest wymagany. wylecial zas na koniec, gdyz powtarzam - wymaga on aby cale Center bylo zdefiniowane. w ten sposob zostalo to osiagniete

oczywiscie, taka metoda jest sposobem ekstremalnym:)
a jak to powinienes byl zrobic -- to rozszczepic klasy na .h i .cpp. klasy typu REF jak najbardziej mozna sobie rozszczepiac rowniez. to, ze kompilator wszystko umieszcza w .h to jest tylko i wylacznie jego fanaberia. jesli konstruktor Form1() w Form1.h bys jedynie zadeklarowal a implementacje wywalil do pliku Form1.cpp -- nie mialbys najmnijszego problemu!

edit: usuniety drobny blad kompilacji

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