CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pytanie dot. przekazywania przez konstruktor.

Pytanie dot. przekazywania przez konstruktor.

dział ogólny

Re: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » poniedziałek, 9 maja 2011, 20:20

Zamieniłem te listCollection na obiekty własnej klasy, tj.

KOD cpp:     UKRYJ  
                        array<Accounts_Structure^> ^ rec2;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, rec2);
                        ac->ShowDialog();
                        MessageBox::Show(rec2[0]->Host);


KOD cpp:     UKRYJ  
        Accounts_Database::Accounts_Database(bool select_accounts, array<Accounts_Structure^> ^rec_)
                {
                        rec_ = gcnew array<Accounts_Structure^>(rozmiar);
                        for each(Accounts_Structure ^% r in rec_)
                        {
                                r =  gcnew Accounts_Structure();
                        }
                        select_accounts_ = select_accounts;
                        rec = rec_;
                        InitializeComponent();

// array<Accounts_Structure^> ^ rec; // w pliku .h


I tutaj wszystko działa. Do pewnego stopnia. Problemem jest rozmiar tablicy rec2, który jest znany dopiero w jednej z funkcji. Trochę to zawiłe, ale... mógłbym do deklaracji lokalnej tej klasy obiektu rec, przypisać referencję którą uzyskam jako argument w konstruktorze, a następnie w odpowiedniej funkcji już zdefiniować go, bo znałbym już rozmiar tablicy ? Czyli przeciągnąć za sobą deklarację obiektu z konstruktora do funkcji by ją następnie zdefiniować jako obiekt. Wydaje mi się to... realne; p Ale nie wiem jak to złożyć.



To jest równoznaczne z zdefniowaniem dwóch obiektów na raz, podanego przez konstruktor i lokalnego do którego jest przypisana referencja tego drugiego. Definiując jeden definiujemy drugi. Teoretycznie.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » wtorek, 10 maja 2011, 08:41

Nie bardzo już Ciebie rozumiem. Nie możesz odwoływać się do deklaracji obiektu klasy w innej klasie, musisz odwoływać się do obiektu. Można się odwoływać do deklaracji zmiennych publicznych innej klasy, ale nie obiektów. Cokolwiek masz przekazać, przekaż to poprzez zmienne.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez polymorphism » wtorek, 10 maja 2011, 11:11

KOD cpp:     UKRYJ  
Accounts_Database::Accounts_Database(..., array<Accounts_Structure^> ^rec_)
{
        rec_ = gcnew array<Accounts_Structure^>(rozmiar);
        ...
        rec = rec_;
        ...
 

Nie wiem, może czegoś nie rozumiem (nie wczytywałem się w wątek), ale jaki jest sens parametru rec_?
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » wtorek, 10 maja 2011, 12:43

rec_ to obiekt, a raczej deklaracja przekazywana przez konstruktor.
Może trochę inaczej, będzie prościej.
Jakaś tam klasa główna, która jest wykonywana:

KOD cpp:     UKRYJ  
                        array<Accounts_Structure^> ^ rec_;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, rec_); // zamienie nazwe deklaracji na nazwe argumentu, będzie czytelniej
                        ac->ShowDialog();


Więc... tworzymy deklaracje, podajemy ją do konstruktora klasy Accounts_Database. Następnie klasa jest "odpalana"(showdialog), potem
w konstruktorze tejże klasy ta deklaracja jest przypisywana jej lokalnemu odpowiednikowi, tak żeby po wyjściu z konstruktora można było obsłużyć ten obiekt ( a raczej jeszcze deklarację)

KOD cpp:     UKRYJ  
        Accounts_Database::Accounts_Database(..., array<Accounts_Structure^> ^rec_)
                {
                        rec = rec_;  }
/// i w pliku h //              array<Accounts_Structure^> ^ rec;


dostajemy się do właściwej funkcji. rec jest (a raczej powinien być, bo nie działa dobrze) referencją do deklaracji podanej przez konstruktor, więc (teoretycznie) tworząc z niej obiekt tworzymy obiekt z deklaracji, którą podaliśmy przez konstruktor. Dlaczego stworzyć można dopiero teraz,a nie w konstruktorze, to chyba widać w kodzie.

KOD cpp:     UKRYJ  
Accounts_Database::funkcja();
                                         array<Accounts_Structure^> ^ rec = gcnew array<Accounts_Structure^>(listView_Accounts->SelectedItems->Count);
// tu jest naspenie przypisywanie do poszczególnych pól obiektu rec, a następnie wywoływana jest metoda Close() na obiekcie klasy Accounts_Database (czyli wychodzimy z showdialog)


A następnie
KOD cpp:     UKRYJ  
                        MessageBox::Show(rec_[0]->Host);


deklaracja rec_ która podczas pracy wewnątrz klasy Accounts_Database, stała się obiektem, powinna zawierać dane jej tam przypisane, czyli messageBox powinien wyświetlić dane przypisane w funkcji Accounts_Database::funkcja()

tak to wygląda w teorii, ale nie wiem jak i czy to w ogóle możliwe



Klasa Acoounts_Database jedynie wykonuje operacje na obiekcie Accounts_Structure, ale, że nie wiem jaki powinien być rozmiar to przekazuje deklarację, tworzę z niej obiekt w tej klasie, a że pracuje na referencji to (teoretycznie) deklaracja przekazana przez konstruktor powinna stać się obiektem. To wszystko.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez polymorphism » wtorek, 10 maja 2011, 13:21

Następnie klasa jest "odpalana"(showdialog), potem w konstruktorze tejże klasy ta deklaracja jest przypisywana jej lokalnemu odpowiednikowi

Przecież showdialog jest odpalany po konstruktorze?! Slynx, strasznie niejasno piszesz. Dużo, ale niejasno. Zdam się na moją intuicję i będę strzelać:
KOD cpp:     UKRYJ  
array<Accounts_Structure^>^ %rec; // definicja pola 'rec' jako referencji (chyba)

...

Accounts_Database::Accounts_Database(..., array<Accounts_Structure^>^ %rec_)
{
        rec = rec_;
        ...
 

O to chodzi?




rec_ to obiekt, a raczej deklaracja przekazywana przez konstruktor.

Deklaracji nie przekażesz przez konstruktor, bo to nie jest wartość. Przekazać możesz obiekt danego typu przez wartość, referencję, wskaźnik lub uchwyt.

deklaracja rec_ która podczas pracy wewnątrz klasy Accounts_Database, stała się obiektem

Nie. Powinno być: "uchwyt rec_, któremu podczas pracy wewnątrz klasy Accounts_Database został przypisany obiekt". Zwracaj uwagę na terminologię, łatwiej będzie Ciebie zrozumieć ;)
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » wtorek, 10 maja 2011, 13:55

wracaj uwagę na terminologię, łatwiej będzie Ciebie zrozumieć

Staram się, uwierz mi.
Następnie klasa jest "odpalana"(showdialog), potem w konstruktorze tejże klasy ta deklaracja jest przypisywana jej lokalnemu odpowiednikowi

Przecież showdialog jest odpalany po konstruktorze?! Slynx, strasznie niejasno piszesz. Dużo, ale niejasno. Zdam się na moją intuicję i będę strzelać:

Tak, dobrze napisałem. ShowDialog jest odpalane po konstruktorze, ale to chyba oczywiste. najpierw tworzymy obiekt, a potem używamy jej metody ( w tym wypadku showdialog())
Zaraz sprawdzę czy to działa.
----

array<Accounts_Structure^> ^ %rec2; error C2530: 'rec2' : references must be initialized

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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » wtorek, 10 maja 2011, 15:15

polymorphism napisał(a):Deklaracji nie przekażesz przez konstruktor, bo to nie jest wartość. Przekazać możesz obiekt danego typu przez wartość, referencję, wskaźnik lub uchwyt.


Od jakiegoś czasu próbuję to uzmysłowić. Nie można przekazać deklaracji, gdyż deklaracja to NIC. To tylko zapowiedź obiektu. Nie można przekazać czegoś co nie istnieje, gdyż nie ma swojego adresu w pamięci.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » wtorek, 10 maja 2011, 15:24

Tak, ale możesz go użyć. Możesz go wywołać z tymże próba wywołania zakończy się błędem nullreference (lub coś w tym stylu). Ale mniejsza o to, wróćmy do tego co kombinuje polymorphism.
Czekam na "replay", a jak nie to zastosuje inną metodę:/
Choć problem zaciekawił mnie czysto teoretycznie.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » wtorek, 10 maja 2011, 16:04

Slynx napisał(a):Tak, ale możesz go użyć. Możesz go wywołać z tymże próba wywołania zakończy się błędem nullreference (lub coś w tym stylu).


Możesz go wywołać, gdyż istnieje deklaracja, ale dopiero przy próbie użycia program niejako sprawdza czy obiekt istnieje, a ponieważ nie istnieje żaden adres tegoż obiektu to masz błąd.
Możesz przekazywać obiekt z jednej klasy do drugiej jeżeli deklaracja tego obiektu jest deklaracją publiczną (sekcja public), ale obiekt musi być stworzony w klasie w której został zadeklarowany. Możesz przekazać go poprzez argument funkcji, ale przy próbie użycia przez funkcję skończy się to błędem, gdyż obiekt nie istnieje.

Choćbyś nie wiem jak kombinował samej deklaracji nie przekażesz, gdyż przekazywać musisz konkretny adres w pamięci, a deklaracja obiektu w odróżnieniu od zmiennych nie rezerwuje pamięci.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » wtorek, 10 maja 2011, 16:51

Więc wpisując mu deklarację jako argument co zostaje wysłane ? Bo coś musi być, jeśli jest to jeden z argumentów.

// ok nie ważne, nie pytałem.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez polymorphism » wtorek, 10 maja 2011, 17:13


array<Accounts_Structure^> ^ %rec2; error C2530: 'rec2' : references must be initialized


No tak, przecież to referencja. Poprzedni post był pisany w lekkim pośpiechu, no i wkradł się drobny błąd.
KOD cpp:     UKRYJ  
Accounts_Database::Accounts_Database(..., array<Accounts_Structure^>^ %rec_)
        :rec(rec_)
{
        ...

powinno być git.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » wtorek, 10 maja 2011, 17:46

Slynx napisał(a):Więc wpisując mu deklarację jako argument co zostaje wysłane ?


Nic nie zostaje wysłane, funkcja po prostu próbuje użyć obiektu przekazanego jako argument, ale obiekt nie istnieje, więc wyskakuje błąd.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » wtorek, 10 maja 2011, 17:52

Zaraz sprawdzę, ale coś kombinowałem i mam takie pytania. Czy przez referencję można usunąć obiekt ? Jeśli tak, to wtedy referencja zacznie wskazywać na NULL, czy na to co zostanie tam później przypisane (innymi słowy, czy zostanie ten sam adres)
-----
Ok, jeszcze raz, bo chyba zgubiłem wątek ; p
Teraz to kompletnie mi nie działa.

Klasa główna
KOD cpp:     UKRYJ  
                        array<Accounts_Structure^> ^ rec_;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, rec_); // zamienie nazwe deklaracji na nazwe argumentu, będzie czytelniej
                        ac->ShowDialog();


konstruktor
KOD cpp:     UKRYJ  
        Accounts_Database::Accounts_Database(..., array<Accounts_Structure^> ^%rec_)
          :rec(rec_)
                {
                       // rec = rec_; // to rozumiem, że usuwam, bo przypisujesz przez konstruktor  
                }

/// i w pliku h //              array<Accounts_Structure^> ^ %rec;
funkcja
KOD cpp:     UKRYJ  
Accounts_Database::funkcja()
{
                                         array<Accounts_Structure^> ^ rec = gcnew array<Accounts_Structure^>(listView_Accounts->SelectedItems->Count);
}


Jeśli tak to ma wyglądać to się nie skompiluje, błąd:


error C3160: 'cli::array<Type> ^%' : a data member of a managed class cannot have this type



jeśli usunę "%" to
błąd ( w trakcie działania) - argument podany przez konstruktor nadal będzie pusty;
jeśli w konstruktorze odkomentuje to przypisanie to nie będzie żadnej różnicy.
jeśli spróbuję w głównej klasie, przy deklaracji rec_ dodać "%" to oczywiście dostanę, że referencje musi być zainicjowana.
Więc...
Jest dużo ciekawych możliwości, ale wszystko dotycz c++, a większość nie ma odpowiedników w C++/CLI :/
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » wtorek, 10 maja 2011, 18:46

Zacznij prawidłowo wstawiać tagi CPP!

Jeżeli kod zawiera więcej niż 4 linie a mniej niż 19 to po bloku kodu będzie duża przerwa, więc wstawiając kod zawierający tylko cztery linie nie rób dodatkowych przerw, czyli nie tak:

KOD text:     UKRYJ  
[CPP]
                        array<Accounts_Structure^> ^ rec_;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, rec_); // zamienie nazwe deklaracji na nazwe argumentu, będzie czytelniej
                        ac->ShowDialog();
[/CPP]


lecz tak:

KOD text:     UKRYJ  
[CPP]                        array<Accounts_Structure^> ^ rec_;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, rec_); // zamienie nazwe deklaracji na nazwe argumentu, będzie czytelniej
                        ac->ShowDialog();[/CPP]


To chyba nie problem, wystarczy wkleić kod, potem go zaznaczyć i wcisnąć przycisk CPP.
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: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez polymorphism » wtorek, 10 maja 2011, 18:46

Dobra, cały plan idzie w diabły, bo:

A tracking reference can only be declared on the stack. A tracking reference cannot be a member of a class.



Tak nawiasem. Jak się ma definicja rec wewnątrz metody funkcja do pola Accounts_Database::rec i do referencji przekazanej w konstruktorze?
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

Poprzednia stronaNastępna strona

  • 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 8 gości

cron