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

Pytanie dot. przekazywania przez konstruktor.

dział ogólny

Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » czwartek, 5 maja 2011, 20:52

Poprawiam pewną funkcję do uploadu/pobierania danych i chciałem podrzucić sobie pewne ułatwienie, by 2 razy nie przekazywać tego samego argumentu.
Wiem, że do podrzucania oryginału do funkcji używa się referencji, ale to trochę bardziej złożone i wolę się upewnić niż napisać i zastanawiać się czy będzie działać. Do rzeczy.
Przekazywanie przez konstruktor obiektu klasy, konkretnie ProgressBar tak by funkcje tej klasy mogły na niej pracować.
Można stworzyć deklarację obiektu ProgressBara w klasie, przypisać właściwy obiekt w konstruktorze, ale co dalej. Ale co dalej ? Jak będę pracował na tej wcześniejszej deklaracji, to mimo wszystko będzie to (chyba) kopia. Proszę o sprostowanie w tej kwestii.

///
Dobra, już nie ważne ; p Gdy skończyłem pisać, zorientowałem się (już nie pierwszy raz), że już sobie odpowiedziałem;p
Trochę głupio tak pisać puste tematy, ale czasami tak jest, że nie możesz znaleźć odpowiedzi, a gdy sobie to rozpiszesz (np. pisząc temat na forum), okazuje się, że nie tłumaczysz tego komuś tylko sobie ;)
Ostatnio edytowano czwartek, 5 maja 2011, 21:41 przez Slynx, łącznie edytowano 1 raz
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 » czwartek, 5 maja 2011, 21:15

Nie zrozumiałem :(
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 » czwartek, 5 maja 2011, 21:23

Rozumiem, że nie rozumiesz ; p Zaraz z edytuje i podrzucę kod, będzie jaśniej. A w tym czasie powiedz mi.... jak się podaje przedziały liczbowe do funkcji ?
Np. rand->Next( <30 ;50> U <70; 90>);
Coś takiego, tylko oczywiście w języku programowania.
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 Corvis » czwartek, 5 maja 2011, 21:31

Yyyyy....

Masz gdzię ProgressBara chcesz napisać klase swoją która będzie mogła pracować na przekazanym przez ciebie ProgressBar-ze ?
Jeżeli tak to zrób to przez wskaźnik.

PSEUDO KOD POGLĄDOWY
KOD cpp:     UKRYJ  
class TMoja {
 public:
 TProgressBar *Postep;
 void __fastcall ZrobCos();
};
void __fastcall TMoja::ZrobCos() {
 if(Postep != NULL) // Cos robisz
}
KOD cpp:     UKRYJ  
TMoja *m = new TMoja();
m->Postep = PRZEKAZYWANY_PROGRESSBAR;
delete m;


JESZCZE RAZ NAPISZĘ, ŻE NIE WIEM CZY DOBRZE CIE ZROZUMIAŁEM I PODAJE TYLKO KONCEPCJE NIE DZIAŁAJĄCY KOD
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » czwartek, 5 maja 2011, 21:44

Wiem, już poprawiłem. Wystarczył zwykły wskaźnik, myślałem, że to będą zabawy w jakieś referencje, itp.
Jak możesz to drugie pytanie. Nie pamiętam, żebym kiedykolwiek stosował coś takiego jak przedział liczbowy przy podawaniu argumenty liczbowego dla funkcji. Domyślam się, że to niemożliwe, ale wolę zapytać (coś na kształt wyrażenia złożonego)
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 Corvis » czwartek, 5 maja 2011, 22:11

Nie kumam za bardzo.

Po 1. Do jakiej funkcji ten przedział ma iść do twojej ?

Od razu napisz co chcesz zrobić lepiej :-)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Slynx » czwartek, 5 maja 2011, 22:18

Ogólnie, jako argument int do każdej funkcji. Można coś takiego przekazać ? Nigdy czegoś takiego nie robiłem i się nad tym nie zastanawiałem.
// może dokładniej, to w przypadku random losuj liczby z konkretnego przedziały liczbowego. więc taki przedział jak pokazałem post wyżej. Można w jakiś sposób

// jak się tak głębiej nad tym zastanowię to wiem, że to niemożliwe. Int to konkretna liczba, nie można przez int całego przedziału... ehh... za bardzo kombinuje :/
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 » piątek, 6 maja 2011, 10:31

Slynx napisał(a):Ogólnie, jako argument int do każdej funkcji. Można coś takiego przekazać ?


Jeżeli argument funkcji jest typu int to można przekazać, ale cała tablicę, no bo w zmiennej to tego nie pomieścisz.

KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Randomize();
}
//---------------------------------------------------------------------------
String __fastcall ProcessArray(const int *iArray, const int iSize)
{
 String sResult = "";
 for(int i = 0; i < iSize; i++)
 {
  sResult += (String)iArray[i] + "; ";
 }

 return sResult;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 const int iSize = 10;
 int *iArray = new int[iSize];

 /* wypełnienie tablicy dynamicznej danymi */
 for(int i = 0; i < iSize; i++)
 {
  iArray[i] = Random(100);
 }

 /* przekazanie tablicy do funkcji poprzez argument dunkcji */
 Edit1->Text = ProcessArray(iArray, iSize);

 delete [] iArray;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 const int iArray[] = {5, 10, 34, 67, 28, 59, 60, 13, 39, 87};
 const int iSize = sizeof (iArray) / sizeof( *iArray );

 /* przekazanie tablicy do funkcji poprzez argument dunkcji */
 Edit2->Text = ProcessArray(iArray, iSize );
}


Jak widzisz przekazywanie tablicy jako argumentu funkcji jest takie same dla tablicy dynamicznej jak i statycznej. Rozmiar tablicy również jest przekazywany poprzez argument, gdyż w żaden sposób nie udało mi się obliczyć rozmiaru tej tablicy. W przykładzie jest pokazany sposób obliczania rozmiaru tablicy statycznej:

KOD cpp:     UKRYJ  
 const int iArray[] = {5, 10, 34, 67, 28, 59, 60, 13, 39, 87};
 const int iSize = sizeof (iArray) / sizeof( *iArray );


ale to działa tylko dla tablicy statycznej i nie działa dla tablicy przekazanej jako argument. Chwilowo nie wiem jak obliczyć rozmiar tej tablicy, tak by nie przekazywać go jako argument funkcji, lecz żeby funkcja sama go sobie obliczyła.
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 » sobota, 7 maja 2011, 14:00

Nie, no tak, ja po prostu zadałem idiotyczne pytanie. A przecież nie przekażę całej tablicy jako argumenty gdy funkcja oczekuje jednego int-a. Zrobiłem to tradycyjnie, tj.
KOD cpp:     UKRYJ  
int x = -1;
while (((x < 48) || (x > 57)) || ((x < 65) || (x > 90)) || ((x < 97) || (x > 122)))
{
        x = Convert::ToInt32(this->MD_Rand_Number(48,122));
}
return x; // lub coś w tym stylu
 

Bez zbędnego główkowania.
/// a jeśli chodzi o wielkość tablicy to wystarczy wywołać właściwość length, która zwraca wielkość tablic lub zrobić tak jak ja robiłem gdy tego nie znałem.
Dla sprawdzenia całkowitej wielkości tablicy - metoda z klas netowych:
KOD cpp:     UKRYJ  
                                 array<String^>^ aa = gcnew array<String^>(100); //definicja tablicy
                                 MessageBox::Show(aa->Length.ToString()); //metoda, a raczej właściwość length
 

Dla sprawdzenia całkowitej wielkości - metoda "na szybko":
KOD cpp:     UKRYJ  
                                 array<String^>^ aa = gcnew array<String^>(100); //definicja tablicy
                                 String^ aaa;
                                 int y = 0;
                                 try
{
                                 while (1)
                                        {
                                        aaa = aa[y];
                                        y++;
                                 }
}
                                 catch(Exception ^e)
                                 {
                                         MessageBox::Show(y.ToString());
                                 }
 

Dla sprawdzenia liczby zainicjowanych elementów:
KOD cpp:     UKRYJ  
                                 array<String^>^ aa = gcnew array<String^>(100); //definicja tablicy
                                 int x = 0;
                                 aa[0] = "dsf";
                                 while (1)
                                 {
                                         if (aa[x] == nullptr) break;
                                        x++;
                                 }

                                                                 MessageBox::Show(x.ToString()); // zwróci 1, bo pierwszy element ma przypisaną wartość.
 
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 » sobota, 7 maja 2011, 16:56

Slynx napisał(a):/// a jeśli chodzi o wielkość tablicy to wystarczy wywołać właściwość length, która zwraca wielkość tablic lub zrobić tak jak ja robiłem gdy tego nie znałem.


Twoje metody w standardowym C++ nie zadziałają. Poza tym pokazałeś sposób na sprawdzenie rozmiaru tablicy typu String, co dla mnie jest równoznaczne z typem AnsiString lub UnicodeString i tutaj rzeczywiście da się to zrobić funkcją Length, ale tylko do sprawdzenia długości łańcucha znaków. Problemem nie jest obliczanie rozmiaru tablicy typu String, czy char, gdyż zadziała tutaj funkcja sizeof, lecz obliczenie rozmiaru tablicy typu integer tworzonej dynamicznie.
Nie sprawdziłeś jednak jak idzie obliczanie rozmiaru tablicy utworzonej dynamicznie, ale przekazanej poprzez argument funkcji. Tutaj rozmiaru tablicy nie da się obliczyć.
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 » sobota, 7 maja 2011, 20:39

Mówiąc rozmiar masz na myśli liczbę elementów czy rozmiar zajmowany w pamięci ?
///
już doczytałem, nie 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

Re: Pytanie dot. przekazywania przez konstruktor.

Nowy postprzez Cyfrowy Baron » sobota, 7 maja 2011, 21:06

Chodzi mi o liczbę elementów. W podanych przykładach rozmiar zajmowanej pamięci jest zbędny.
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 » poniedziałek, 9 maja 2011, 18:50

Ok, trzeba jeszcze wrócić do tematu, bo mam ten sam problem, tylko z trochę innym podejściem.
ProgressBar był obiektem, a co jeśli chcę przekazać przez konstruktor zaledwie deklarację obiektu, bo definicje można stworzyć dopiero wewnątrz tej klasy ? Może na przykładzie:
KOD cpp:     UKRYJ  
        ListView::ListViewItemCollection^ Data::Accounts_Import_From_Database()
                {
                        ListView::SelectedListViewItemCollection^ lvi_col;
                        Accounts_Database ^ ac = gcnew Accounts_Database(true, lvi_col);
                        ac->ShowDialog();
//                      MessageBox::Show(lvi_col->Count.ToString()); // błąd, brak obiektu
return lvi_col;
                }
 


//konstruktor
KOD cpp:     UKRYJ  
        Accounts_Database::Accounts_Database(bool select_accounts, ListView::SelectedListViewItemCollection^ lvi_c)
                {
                        select_accounts_ = select_accounts;
                        lvi_c_ = lvi_c; // w pliku .h jest deklaracja lvi_c_ // ListView::SelectedListViewItemCollection ^ lvi_c_;
                        InitializeComponent();
                }
///
/// Jakaś tam funkcja
                                         lvi_c_ = listView_Accounts->SelectedItems; // czyli inicjalizacja lvi_c_ obiektami klasy listView;
 

Problemem jest to, że obiekt przekazany przez konstruktor nie otrzymuje tych samych elementów (pozostaje jedynie deklaracją), a progressBar o którym mówiłem na początku od razu był zdefiniowany. (selectedListViewItemCollection nie może być, bo nie ma typowego konstruktora)
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 » poniedziałek, 9 maja 2011, 18:58

Slynx napisał(a): obiekt przekazany przez konstruktor nie otrzymuje tych samych elementów (pozostaje jedynie deklaracją),


Deklaracja nie tworzy obiektu, a jedynie informuje o tym, że obiekt ma być utworzony. Jaki sens przekazywać deklarację z jednej klasy do drugiej skoro można w każdej klasie umieścić taką deklarację. Przekazywać można tylko obiekty, ale nie deklaracje obiektów.
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 » poniedziałek, 9 maja 2011, 19:30

No ok, ale ja potrzebuje potem odzyskać te dane, które on przetworzy w tej klasie, a do tego potrzebuje mieć referencję do jakiegoś obiektu lub deklarację gdy obiektu nie da się zdefiniować poza klasą.
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

Nastę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 19 gości