🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Esercizi Distruttori Classi C++

Codegrind Team•Jul 12 2024

Ecco degli esercizi semplici con soluzione per praticare le basi dei distruttori delle classi in C++.

Esercizio 1: Distruttore di default

Creare una classe con un distruttore di default e stampare un messaggio quando viene chiamato.
#include <iostream>

class Esempio {
public:
    Esempio() {
        std::cout << "Costruttore chiamato" << std::endl;
    }
    ~Esempio() {
        std::cout << "Distruttore chiamato" << std::endl;
    }
};

int main() {
    Esempio e;
    return 0;
}

Esercizio 2: Distruttore per liberare memoria dinamica

Creare una classe con un distruttore che libera memoria allocata dinamicamente.
#include <iostream>

class Esempio {
private:
    int* data;
public:
    Esempio(int size) {
        data = new int[size];
        std::cout << "Memoria allocata" << std::endl;
    }
    ~Esempio() {
        delete[] data;
        std::cout << "Memoria deallocata" << std::endl;
    }
};

int main() {
    Esempio e(10);
    return 0;
}

Esercizio 3: Distruttore per chiudere un file

Creare una classe con un distruttore che chiude un file aperto nel costruttore.
#include <iostream>
#include <fstream>

class FileHandler {
private:
    std::ofstream file;
public:
    FileHandler(const std::string& filename) {
        file.open(filename);
        if (file.is_open()) {
            std::cout << "File aperto" << std::endl;
        }
    }
    ~FileHandler() {
        if (file.is_open()) {
            file.close();
            std::cout << "File chiuso" << std::endl;
        }
    }
};

int main() {
    FileHandler fh("esempio.txt");
    return 0;
}

Esercizio 4: Distruttore per oggetti smart pointer

Creare una classe con un distruttore che dealloca oggetti gestiti da smart pointer.
#include <iostream>
#include <memory>

class Esempio {
private:
    std::unique_ptr<int> ptr;
public:
    Esempio(int val) : ptr(std::make_unique<int>(val)) {
        std::cout << "Costruttore chiamato" << std::endl;
    }
    ~Esempio() {
        std::cout << "Distruttore chiamato" << std::endl;
    }
};

int main() {
    Esempio e(42);
    return 0;
}

Esercizio 5: Distruttore per una classe base

Creare una classe base con un distruttore virtuale e una classe derivata.
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Costruttore Base chiamato" << std::endl;
    }
    virtual ~Base() {
        std::cout << "Distruttore Base chiamato" << std::endl;
    }
};

class Derivata : public Base {
public:
    Derivata() {
        std::cout << "Costruttore Derivata chiamato" << std::endl;
    }
    ~Derivata() {
        std::cout << "Distruttore Derivata chiamato" << std::endl;
    }
};

int main() {
    Base* ptr = new Derivata();
    delete ptr;
    return 0;
}

Esercizio 6: Distruttore per gestire risorse multiple

Creare una classe con un distruttore che gestisce la deallocazione di risorse multiple.
#include <iostream>

class GestoreRisorse {
private:
    int* memoria1;
    int* memoria2;
public:
    GestoreRisorse() {
        memoria1 = new int[10];
        memoria2 = new int[20];
        std::cout << "Risorse allocate" << std::endl;
    }
    ~GestoreRisorse() {
        delete[] memoria1;
        delete[] memoria2;
        std::cout << "Risorse deallocate" << std::endl;
    }
};

int main() {
    GestoreRisorse gr;
    return 0;
}

Esercizio 7: Distruttore per una classe contenente oggetti di altre classi

Creare una classe con un distruttore che gestisce la deallocazione di oggetti di altre classi.
#include <iostream>

class AltraClasse {
public:
    AltraClasse() {
        std::cout << "Costruttore AltraClasse chiamato" << std::endl;
    }
    ~AltraClasse() {
        std::cout << "Distruttore AltraClasse chiamato" << std::endl;
    }
};

class Esempio {
private:
    AltraClasse ac;
public:
    Esempio() {
        std::cout << "Costruttore Esempio chiamato" << std::endl;
    }
    ~Esempio() {
        std::cout << "Distruttore Esempio chiamato" << std::endl;
    }
};

int main() {
    Esempio e;
    return 0;
}

Esercizio 8: Distruttore per oggetti dinamici

Creare una classe con un distruttore che dealloca oggetti creati dinamicamente nel costruttore.
#include <iostream>

class Esempio {
private:
    AltraClasse* ac;
public:
    Esempio() {
        ac = new AltraClasse();
        std::cout << "Costruttore Esempio chiamato" << std::endl;
    }
    ~Esempio() {
        delete ac;
        std::cout << "Distruttore Esempio chiamato" << std::endl;
    }
};

int main() {
    Esempio e;
    return 0;
}

Esercizio 9: Distruttore per una classe con array di oggetti

Creare una classe con un distruttore che dealloca un array di oggetti.
#include <iostream>

class AltraClasse {
public:
    AltraClasse() {
        std::cout << "Costruttore AltraClasse chiamato" << std::endl;
    }
    ~AltraClasse() {
        std::cout << "Distruttore AltraClasse chiamato" << std::endl;
    }
};

class Esempio {
private:
    AltraClasse* arr;
    int size;
public:
    Esempio(int s) : size(s) {
        arr = new AltraClasse[size];
        std::cout << "Array di AltraClasse allocato" << std::endl;
    }
    ~Esempio() {
        delete[] arr;
        std::cout << "Array di AltraClasse deallocato" << std::endl;
    }
};

int main() {
    Esempio e(5);
    return 0;
}

Esercizio 10: Distruttore per oggetti con file aperti

Creare una classe con un distruttore che chiude un file aperto.
#include <iostream>
#include <fstream>

class GestoreFile {
private:
    std::ofstream file;
public:
    GestoreFile(const std::string& filename

) {
        file.open(filename);
        if (file.is_open()) {
            std::cout << "File aperto" << std::endl;
        }
    }
    ~GestoreFile() {
        if (file.is_open()) {
            file.close();
            std::cout << "File chiuso" << std::endl;
        }
    }
};

int main() {
    GestoreFile gf("esempio.txt");
    return 0;
}