Bardzo się to wszystko tutaj pogmatwało i należałby to uporządkować.
Przede wszystkim to nie ma żadnego wymogu mówiącego, że klasy należy tworzyć w oparciu do dwa pliki - źródłowy i nagłówkowy. Wszystko można wrzucić do jednego pliku z rozszerzeniem H lub CPP.
Nie bardzo wiem jak to jest w c++/cli, ale w c++ jeżeli chcesz stworzyć jakiś obiekt w oparciu o klasę to musisz w sekcji include dołączyć plik nagłówkowy zawierający implementację tejże klasy. W C++Builder będzie to
#include <Forms.hpp>.
Punktator
^ jest uchwytem do zarządzanego obiektu. Uchwyt nie jest wskaźnikiem lecz zarządzaną referencją, a to oznacza (tak ja to rozumiem), że już podczas tworzenia obiektu będącego referencją trzeba ustalić na co będzie wskazywać i nie można jej później modyfikować.
Funkcja
gcnew zwraca uchwyt nie wskaźnik i jest używana do inicjowania obiektów
CLR (Common Language Runtime - z ang. Środowisko Uruchomieniowe Wspólnego Języka) i zwraca uchwyt do nowo tworzonego obiektu na stercie
CLR.
To tyle. Mi to wiele nie mówi.
Wrócę teraz do Twojego postu:
http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1181&start=15#p8179W pierwszym przykładzie mamy taki oto fragment kodu:
#pragma once
#include "class.h"
#include "aaa.h" // <-- Tu tkwi problem, gdy chcę dodać podrzędną klasę do głównej i gdy główna musi być użyta w podrzędnej. (obydwie korzystają z siebie nawzajem ;p)
namespace aa { // <-- PATRZ TUTAJ
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 // <-- PATRZ TUTAJ
{
a w trzecim, który korzysta z tego pliku mamy:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
Form1^ dlg = gcnew Form1(); // <-- PATRZ TUTAJ
dlg->KKK.NAME[1] = "as";
Rzecz w tym, że klasa Form1 pierwszego pliku znajduje się w przestrzeni nazw aa, więc należałoby odwoływać się do tej przestrzeni, czyli:
aa::Form1^ dlg = gcnew aa::Form1();
ale prościej będzie dodać:
Wydaje się, że skoro w obydwu plikach wszystko umieszczasz w przestrzeni nazw o tej samej nazwie, to nie powinieneś odwoływać się do obiektów poprzez tą przestrzeń nazw i... tutaj nie jestem pewien...
Te błędy:
1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'Form1' : undeclared identifier 1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2065: 'dlg' : undeclared identifier 1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(99) : error C2061: syntax error : identifier 'Form1' 1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2065: 'dlg' : undeclared identifier 1>c:\users\slynx\documents\visual studio 2008\projects\aa\aa\aaa.h(100) : error C2227: left of '->KKK' must point to class/struct/union/generic type |
wskazują na to, że nie rozpoznawana jest klasa Form1, co może być spowodowane tym, że znajduje się w przestrzeni nazw i trzeba tej przestrzeni użyć.
Poly, mam do Ciebie prośbę jeśli masz chwilkę czasu. Może mógłbyś ten przykładowy program rozłożyć na pliki cpp. i .h ?
To nie jest konieczne, wszystko może być w jednym pliku, o czym wspomniałem na początku.