• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dynamiczna w obiektowym C++

Object Storage Arubacloud
0 głosów
287 wizyt
pytanie zadane 9 maja 2020 w C i C++ przez chomik1 Nowicjusz (140 p.)

Do klasy MojaKlasa (Program #6) dodaj pole nast, tak aby można było tworzyć listę dynamiczną jednokierunkową obiektów typu MojaKlasa.

Następnie zaprojektuj nową klasę Wykladowca, która zawiera pole typu MojaKlasa* wskazujące na listę dynamiczną jednokierunkową. Pole to ma pełnić rolę głowy dynamicznej listy grup studenckich przypisanych do danego wykładowcy. Klasa Wykladowca może też zawierać inne pola, jeżeli okażą się potrzebne.

Do klasy Wykladowca dodaj konstruktory:

  1. konstruktor domyślny, inicjalizujący obiekt tak, aby lista dynamiczna była pusta.
  2. konstruktor z argumentem reprezentującym nazwę pliku tekstowego. Plik zawiera listę kilku adresów e-mail. Konstruktor tworzy jeden obiekt dynamiczny typu MojaKlasa, do którego zostają zapisane adresy e-mail odczytane z pliku. Następnie obiekt ten jest dołączany do listy dynamicznej.
  3. konstruktor kopiujący, który tworzy kopię listy dynamicznej z obiektu podanego w argumencie wywołania.

oraz destruktor, który zwalnia wszystkie dynamicznie zaalokowane zasoby.

#include <cstdio>
#include <cstring>
using namespace std;

class MojaKlasa {
	char **email; 
	int ile;
	public:
	MojaKlasa(int x);
	MojaKlasa(MojaKlasa& mk);	// konstruktor kopiujący
	void setemail(char* adres, int idx) { strcpy(email[idx],adres); }
	char* getemail(int idx) { return email[idx]; }
};
MojaKlasa:: MojaKlasa(int x) {
	email = new char*[ile = x];
	for (int i=0;i<ile;i++) email[i] = new char[100];
}

MojaKlasa::MojaKlasa(MojaKlasa& mk) {
	email = mk.email;			// czy to jest OK?
}
/*
MojaKlasa::MojaKlasa(MojaKlasa& mk) {
	email = new char*[mk.ile];
	ile = mk.ile;
	for (int i=0;i<ile;i++) {
		email[i] = new char[100];
		strcpy(email[i],mk.email[i]);
	}
}
*/
int main() {
	MojaKlasa MK(3);
	MK.setemail("k.trojanowski@uksw.edu.pl",0);
	MojaKlasa MK2(MK);
	printf("%s\n", MK2.getemail(0));
	MK.setemail("m.mikolajczyk@uksw.edu.pl",0);
	printf("%s\n", MK2.getemail(0));
	return 0;
}

Nie wiem jak tworzyć takie listy dynamiczne obiektowe w C++, nie umiem zrobić tych konstruktorów.

1 odpowiedź

0 głosów
odpowiedź 9 maja 2020 przez j23 Mędrzec (194,920 p.)
edycja 9 maja 2020 przez j23

// czy to jest OK?

Nie. Ten zakomentowany ctor kopiujący wygląda OK (z wyjątkiem parametru, który powinien być const referencją).

Co do listy:

class MojaKlasa {
public:
    MojaKlasa* nast = nullptr;
};

class Wykladowca {
    MojaKlasa* grupy = nullptr;

public:
    void dodajGrupe(const MojaKlasa& grupa)
    {
        MojaKlasa* p = grupy;
        if (!p) {
            grupy = new MojaKlasa(grupa);
            return;
        }

        while (p->nast) p = p->nast;
        p->nast = new MojaKlasa(grupa);
    }

    ...
};

Dla efektywniejszego dodawania nowych grup można dodać jeszcze jeden wskaźnik grupyOgon (uwielbiam polskie nazwy w programowaniu ;/) wskazujący na ostatni element listy, wtedy pętla while byłaby zbędna:

void dodajGrupe(const MojaKlasa& grupa)
{
    if (!grupyOgon) {
        grupy = grupyOgon = new MojaKlasa(grupa);
    }
    else {
        grupyOgon->nast = new MojaKlasa(grupa);
        grupyOgon = grupyOgon->nast;
    }
}

 

Podobne pytania

+1 głos
1 odpowiedź 785 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 8 maja 2019 w C i C++ przez Ryszard Kałuziński Początkujący (280 p.)
0 głosów
2 odpowiedzi 833 wizyt

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...