CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [c++/cli]Problem z inicjalizacją w konstruktorze

[c++/cli]Problem z inicjalizacją w konstruktorze

dział ogólny

[c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » piątek, 25 marca 2011, 13:04

Klasa Typ1.h:
KOD cpp:     UKRYJ  
// Tu są różne pola, nie będę wypisywał wszystkiego, bo mija się to z celem.
//...
String^ Pole1;
String^ Pole2;
String^ Pole3;
array<String^> ^ Pole4;
Typ1();
//...
Klasa Typ1.cpp:
KOD cpp:     UKRYJ  
//...
// Tu jest tylko inicjalizacja wszystkich zmiennych wewnątrz konstruktora.
        Typ1::Typ1()
                {
        Pole4 = gcnew array<String^>(10);
//...
                }
Klasa Data.h:
KOD cpp:     UKRYJ  
//...
array<Typ1^>^ main_table;
//...


Klasa Data.cpp:
KOD cpp:     UKRYJ  
//.......
main_table = gcnew array<Typ1^>(100);
main_table[0]->Pole1 = ""; // <- Tu kompilator wskazuje błąd
// itd., itd.


I klasa główna programu:
KOD cpp:     UKRYJ  
//...
Data ^ dat = gcnew Data();
// I tu jest trochę funkcji z klasy Data.
//...


Problem jest w konstruktorze klasy Data, przy odwoływaniu się do pól obiektu "main_table", z błędem "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu". Nie bardzo wiem, gdzie jest błąd. W debuggerze w ogóle nie pokazuje pól. Traktuje to jak zwykłą 100 elementową tablicę.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez polymorphism » piątek, 25 marca 2011, 14:36

Jeśli dobrze rozumiem znaczenie znaku ^, to main_table jest tablicą uchwytów do obiektów klasy Typ1. Zatem zanim zaczniesz odwoływać się do obiektów wewnątrz tej tablicy, stwórz je najpierw.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » piątek, 25 marca 2011, 14:42

To on sam nie wywoła konstruktora dla tej klasy ?
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Cyfrowy Baron » piątek, 25 marca 2011, 14:59

Slynx napisał(a):To on sam nie wywoła konstruktora dla tej klasy ?


Wtrącę się na chwilę, gdyż pytanie wydaje mi się dziwne, lub czegoś nie zrozumiałem. Czy możliwe jest wogóle stworzenie klasy bez utworzenia definicji konstruktora tej klasy?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez polymorphism » piątek, 25 marca 2011, 15:12

To on sam nie wywoła konstruktora dla tej klasy ?

A jak definiujesz jakiś wskaźnik, to z automatu tworzy Ci się do niego obiekt? Nie. Podejrzewam, że z uchwytami w C++/CLI jest tak samo.

Czy możliwe jest wogóle stworzenie klasy bez utworzenia definicji konstruktora tej klasy?

Przecież zdefiniował konstruktor dla Typ1 :zawiedziony: Odpowiadając ogólnie, nie musisz definiować konstruktorów, podobnie jak destruktorów, jeśli nie ma takiej potrzeby.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » piątek, 25 marca 2011, 20:11

No dobra, fajnie. Konstruktor dla klasy Typ1, ale... gdzie ? Przecież nie można zrobić jakiejś kombinacji z array, a wywołanie jednokrotne (jeśli dobrze rozumiem) nic nie da, bo tablica jest 100 elementowa.

Najlepiej po prostu pokaż jak to wygląda w kodzie.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez polymorphism » piątek, 25 marca 2011, 20:50

KOD cpp:     UKRYJ  
for each (Typ1 ^%h in main_table)
{
    h = gcnew Typ1();
}

Radosna twórczość...
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Slynx
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » piątek, 25 marca 2011, 21:24

Może i radosna, ale nie wiedziałem, że tak można. Zaraz zobaczę czy to będzie działać.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » piątek, 25 marca 2011, 23:57

Ok, to działa. Mam jeszcze coś. Ten obiekt o którym była mowa, muszę zmusić do działania dla całego programu, wszystkich podklas i funkcji. Szukałem trochę na ten temat, użycie extern i kilka innych obcych mi metod, ale problemem zawsze jest niezgodność kodu natywnego z netowym.
Co dokładnie - Klasa Data jest główną klasą programu, w niej są kolejne klasy i kolejne, wszystko poukładane (prawie) hierarchicznie, tak więc jak łatwo się domyślić, obiekt tej klasy powinien być tworzony tylko jeden podczas działania całego programu. Mówiąc prościej, potrzebuję mieć dostęp do jej pól i funkcji z każdego elementu programu. Wcześniej tworzyłem wskaźniki, ale chyba coś przed tym schrzaniłem, bo dane nie były przekazywane z innych okien i funkcji.
Obiekt Klasy dostępny dla całego programu, tak by później nie było już z tym problemu. To kluczowy element, więc póki nie mam pewności, że da się to zrobić bez przerabiania połowy programu, wstrzymam się z dalszym pisaniem funkcji.

P.S. Z góry przepraszam, ze nieścisłości, itp., także dotyczące poprzednich pytań, ale to dopiero mój drugi program i jeszcze nie ogarniam tych wszystkich funkcji i metod pisania w - z góry - poprawny sposób.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez polymorphism » sobota, 26 marca 2011, 11:36

A pytanie brzmi? :D

Jeśli dobrze zrozumiałem to, co napisałeś, potrzebny Ci klasyczny singleton. Czyli:
KOD cpp:     UKRYJ  
public ref class Data
{
private:

        (...)
       
        static Data^ m_instance;
       
        Data() { ... } //<--- musi być prywatny (lub chroniony)
public:
        (...)

        static Data^ Get()
        {
                if(m_instance == nullptr)
                        m_instance = gcnew Data();
                return m_instance;
        }
       
};

Data^ Data::m_instance = nullptr;

Dostęp do klasy masz poprzez wywołanie:
KOD cpp:     UKRYJ  
Data::Get().foo(1, 2, 3);



P.S. pamiętaj o tym, że nie znam C++/CLI, więc to nie musi działać/kompilować się od razu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » niedziela, 27 marca 2011, 18:22

Kod: Zaznacz cały
Data.h(108) : error C2374: 'm_instance' : redefinition; multiple initialization
Data::m_instance' : static data members of managed types must be defined within the class definition

U siebie mam podział na pliki .h i .cpp, więc może coś inaczej powinno być poumieszczane.

A jeśli chodzi o singleton (pisałem posta, chyba ze dwa dni temu, ale dopiero teraz zauważyłem, że na serwer nie doszedł), to czytałem o tym i właśnie tak myślałem, że to jest to czego mi brakuje, ale właśnie nie umiałem tego poprawnie zakodować.
-
Aha, linia 108 to "Data^ Data::m_instance = nullptr;";
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez polymorphism » niedziela, 27 marca 2011, 21:36

więc może coś inaczej powinno być poumieszczane.

Wystarczy przeczytać, co kompilator napisał w treści błedu: 'static data members of managed types must be defined within the class definition'. Czyli usuń linię 108 i daj:
KOD cpp:     UKRYJ  
public ref class Data
{
private:

        (...)
       
        static Data^ m_instance = nullptr;

        (...)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [c++/cli]Problem z inicjalizacją w konstruktorze

Nowy postprzez Slynx » poniedziałek, 28 marca 2011, 19:04

Ok, ja już wpadam tylko podziękować ; ) Wszystko świetnie działa, przynajmniej się kompiluje. Nie wiem jak z danymi. Mam nadzieję, że będzie ok. Anyway,
wielkie dzięki za pomoc, dla Ciebie to nic, dla mnie to było bardzo ważne ; )
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości