Przekazanie dynamicznej tablicy z main() do funkcji w obiekcie

2011-10-11 19:41

Rejestracja: 11 lat temu

Ostatnio: 2 lata temu

0

Chciałbym w funkcjach utworzonego obiektu móc czytać wartości tablicy utworzonej w main(). Nie chcę tworzyć kopii tablicy dla każdego nowego obiektu, wystarczy że mogę czytać z tej raz utworzonej.
Zobrazowanie problemu:

void main()
{   

    int* tablica;
    int rozmiar;    //rozmiar struktury, liczba operacji//
    //tutaj wczytanie danych o rozmiarze i elementach tablicy z pliku//
    obiekt= a*;
    a= new obiekt(tablica);
}

class obiekt
{
    public:
        obiekt(int []);
        void czytaj_z_tablicy(int);
};

obiekt::obiekt(int tablica_z_main[]){
czytaj_z_tablicy(3);
}

void obiekt::czytaj_z_tablicy(int indeks){
cout<<tablica_z_main(indeks);//w tym miejscu chciałbym odczytać wartość tabeli utworzonej w main()//
}

O ile w konstruktorze da się czytać zawartość tabeli to w funkcjach obiektu już nie. Domyślam się, że trzeba skorzystać z referencji ale nie potrafię sobie z tym poradzić.

edytowany 2x, ostatnio: Suchus, 2011-10-11 19:49

Pozostało 580 znaków

2011-10-11 19:56

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Da się to zrobić, obiekt może mieć wskaźnik do pierwszego elementu tablicy. Ale nie jest to dobre rozwiązanie, lepiej by było gdyby obiekt miał własną tablicę (lub najlepiej vector).

Pozostało 580 znaków

2011-10-11 20:20

Rejestracja: 11 lat temu

Ostatnio: 2 lata temu

0

Chciałbym uniknąć kilkukrotnego czytania z pliku. Mam kilka klas które korzystają z jednych danych. Wydaje mi się, że najlepiej wczytać te dane raz w main(), a następnie każdemu obiektowi mówić o adresie tablicy. Tak żeby nie kopiować jej za każdym razem. Vektor jest chyba nie potrzebny bo chciałbym tylko czytać z danych. Niestety nie potrafię sobie poradzić z tym.

Jakie to są dane, które są potrzebne kilku obiektom. Ja bym zmienił koncepcję (np. czy nie lepszą abstrakcją byłyby po prostu funkcję pobierające tablicę). - Zjarek 2011-10-11 21:51
Dodatkowo vector różni się tym od tablicy, że przechowuje rozmiar i automatycznie zwalnia pamięć. Narzut wynikający z używania vectora w porównaniu z tablicą alokowaną new jest praktycznie zerowy. Jeżeli nie przekazujesz go przez wartość to wszystko będzie dobrze. - Zjarek 2011-10-11 21:55
Program ma cztery klasy: dwa stosy i dwie kolejki. Wszystkie cztery korzystają z jednych danych. Klasy korzystają z dziedziczenia czyli funkcje, które są identyczne dla wszystkich (np empty- struktura pusta, full- struktura pełna, struktury są już na vector nie na tablicy). Funkcja odpowiedzialna za pobieranie danych też jest dziedziczona, czyli dane odczytywane są z pliku cztery raz. Nie jest to dobre moim zdaniem. Stąd pomysł wczytywania w main()- będzie odbywał się tylko raz. Mógłbyś objaśnić pomysł z funkcją pobierającą tablicę bo nie zrozumiałem jak mógłbym ją wykonać. - Suchus 2011-10-11 22:18

Pozostało 580 znaków

2011-10-11 21:20

Rejestracja: 8 lat temu

Ostatnio: 3 lata temu

0
class obiekt
{
public:
    obiekt(int* p_tab, int p_size) : m_pTab(p_tab), m_size(p_size) {}
    void czytaj_z_tablicy(int);
private:
    int* m_pTab;
    int m_size;
};

int main()
{
    int tabsize = 100; //ustawione wcześniej w zależności od ilości danych
    int* pTablica = new int[tabsize];
    // jakieś czytanie do tablicy
    obiekt ob(pTablica, tabsize);
}
edytowany 2x, ostatnio: Tomek2, 2011-10-11 21:31
Problem się pojawia jak obiekt żyje dłużej niż tablica. To jest niebezpieczny sposób kodowania. - Zjarek 2011-10-11 21:52
Dzięki za zaproponowane rozwiązanie. Sytuacja gdy obiekt żyje dłużej niż tablica u mnie nie ma miejsca, ale dziękuję za uwagę. - Suchus 2011-10-11 22:02

Pozostało 580 znaków

2011-10-12 00:55

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

Jak mówiłem, zastanowiłbym się nad konstrukcją programu. Jeżeli klasa bazowa ma udostępniać funkcje związane z pobraniem danych i ich udostępnieniem klasom pochodnym to nie jest to odpowiednia relacja do dziedziczenia. Powinieneś to zapakować w osobną klasę i w tych 4 klasach dać obiekt tej klasy jako pole (a nawet lepiej jako shared_ptr do obiektu z danymi). Ogólnie przy dziedziczeniu trzeba się zastanowić, czy obiekt pochodny można traktować jako obiekt bazowy. Przykładowo dziedziczenie obiektu bez funkcji wirtualnych jest bez sensu.

Dziedziczenie tylko dla używania tego same kodu w wielu miejscach utrudnia zrozumienie programu. Zastanów się która relacja ma większy sens: kolejka ma dane wejściowe, czy kolejka jest danymi wejściowymi. Powinno się używać dziedziczenia, jeżeli chce się użyć ponownie zachowanie, a nie kod.

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0