Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pobranie n-danych z obiektu do main()

Ostatnio zmodyfikowano 2016-12-08 00:34
Autor Wiadomość
PL_Andrev
Temat założony przez niniejszego użytkownika
Pobranie n-danych z obiektu do main()
» 2016-12-07 14:16:26
Witam,

Napisałem mały programik do wyciągania danych z obiektu.
O ile wyciągniecie 1 konkretnej wartości nie jest problemem (w przykładzie Get_min), do nie jestem w stanie poradzić sobie z metodą zwracającą dwie(lub więcej) wartości według zadanego klucza zmiennych.

C/C++
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <iostream>
class Klasa
{
    int amin, amax, adelta;
public:
    void Set( int a_min, int a_max, int a_del );
    // <- pobiera 1 wybrana zmienna
    int Get_min();
   
    //pobiera 2 zmienne
    void Get_two( int a, int b );
};

// -> deklaracja wpisania wartosci zmiennych do obiektu
void Klasa::Set( int a_min, int a_max, int a_del )
{
    amin = a_min;
    amax = a_max;
    adelta = a_del;
}

// -> tu odbieram 1 wartosc z obiektu
int Klasa::Get_min()
{
    return amin;
}

// -> tu odbieram 2 wartosci z obiektu
void Klasa::Get_two( int a, int b )
{
    a = amin;
    b = amax;
}

TForm1 * Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1( TComponent * Owner )
    : TForm( Owner )
{
    //konstrukcja obiektu k
    Klasa k;
    k.Set( 15, 100, 0 );
   
    //wyciąganie 1 danej z obiektu k
    int a = k.Get_min();
    ShowMessage( IntToStr( a ) );
   
    //wyciąganie 2 danych z obiektu k
    k.Get_two( int a, int b ); //***************** <-expression syntax
    ShowMessage( IntToStr( a ) + " = " IntToStr( b ) );
}

Problem:

O ile funkcja Get_min działa, to "nieeleganckie" byłoby przygotowanie ilości n metod Get_cośtam do wywołania pojedynczych zmiennych.
Gdzie zatem jest błąd w powyższym przykładzie metody Get_two ?  
P-154614
mateczek
» 2016-12-07 14:18:33
Swoją drogą dlaczego robisz okienka, skoro piszesz programy konsolowe ?? a konstruktor traktujesz jak funkcję main??
C/C++
void Klasa::Get_two( int & a, int & b )
{
    a = amin;
    b = amax;
}
P-154615
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2016-12-07 15:05:43
Nie działa, dalej jest expression syntax.



P-154617
mateczek
» 2016-12-07 15:13:24
No nie działa bo jest jescze jeden błąd !!!!
C/C++
__fastcall TForm1::TForm1( TComponent * Owner )
    : TForm( Owner )
{
    int a, b;
    k.Get_two( a, b ); //***************** <-expression syntax
}
P-154618
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2016-12-07 15:42:09
Teraz działa - dzięki!

Co do twojego pytania - tak w ogóle jestem "noob" w C++ i świeżo co przesiadłem się z VB.NET.
W sieci (np. na tej stronie) są kursy C++ ale konsolowe - robię je pod okienkami bo przy okazji uczę się obsługi tychże okienek (powiązanie z klasami).



 
P-154619
PL_Andrev
Temat założony przez niniejszego użytkownika
» 2016-12-07 22:25:09
Podzieliłem powyższy program na trzy części:
1) plik z klasą i funkcjami obsługującymi klasy;

2) plik główny
C/C++
Klasa k1; //<< niezbedne aby program zaczął działać
generate();

//wyciąganie 2 danych z obiektu k
int q1, q2;
k1.Get_two( q1, q2 );

3) funkcja startowa, która dla testów będzie budowała po jednym obiekcie z każdej klasy składającym się z kilkudziesięciu zmiennych - funkcja main() na tej podstawie opracuje okienkowy wynik dla budowania graficznej interpretacji zależności klasaA(obiektA)<->klasaB(obiektB).
C/C++
void generate()
{
    ShowMessage( "odpalam generator obiektow" );
   
    int x1 = 15;
    int y1 = 100;
    int z1 = 0;
   
    Klasa k1;
    k1.Set( x1, y1, z1 );

Jak wyżej wspomniałem - obiekty docelowo będą miały po kilkadziesiąt zmiennych, więc do celów testowych uruchamiam je z zewnętrznej funkcji z wartościami domyślnymi.

Problem:
Dopóki funkcja generate() znajduje się w main() wszystko działa poprawnie.
Jeżeli natomiast znajduje się w osobnym pliku, to wiadomość kontrolna jest wyświetlana, ale wywołanie danych obiektu z main() funkcją k1.Get_two() daje wartości "śmieciowe", niezgodne z wcześniej zadeklarowanymi w funkcji generate().
P-154634
mateczek
» 2016-12-08 00:34:09
To nie ma prawa działać. Nic co jest "tworzone " w funkcji generate(), nie ma prawa wyjść poza tą funkcję !!!
P-154643
« 1 »
  Strona 1 z 1