Przekazanie dynamicznej tablicy z main() do funkcji w obiekcie

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ć.

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).

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.

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);
}
1

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.

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