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

Lista dynamiczna w obiektowym C++

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
118 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 (189,140 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ź 217 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,410 p.)
0 głosów
1 odpowiedź 151 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 549 wizyt

90,303 zapytań

138,899 odpowiedzi

311,089 komentarzy

60,019 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...