Jak zablokowac domyslny konstruktor w klasie bazowej?

0

Witam,
Utworzylem nastepujaca klase:


#ifndef _MACIERZ_H
#define _MACIERZ_H

class Macierz {
protected:
    int ilkolumn;
    int ilwierszy;
    float** macierz;
public:
    Macierz();
    Macierz(int, int);
    Macierz(std::string);
    ~Macierz();
    void wyswietl();
    void zrobzerowa();
    void randomizuj();
    // obsluguje dwie nieujemne
    void randomizuj(int, int);
};

// do obslugi macierzy kwadratowych
class Kwadratowa : public Macierz {
public:
    Kwadratowa(int);
    ~Kwadratowa();
    void jednostkowa();
    float wyznacznik();
};

#endif /* _MACIERZ_H */

Program nie chce sie kompilowac jesli nie dopisze domyslnego konstruktora Macierz::Macierz() nawet jesli obiekty sa tworzone tylko w nastepujacy sposob:
Macierz a(2, 5);
Macierz b(3,5);
Przeniesienie konstruktora Macierz::Macierz() do sekcji prywatnej klasy nie rozwiazuje problemu. Chce zabronic by nie mozna bylo tworzyc obiektow w ten sposob:
Macierz c;
Logicznym rozwiazaniem wydaje sie brak takiego konstuktora.

Komunikat kompilatora:

g++ -o main main.cpp macierz.cpp -g
macierz.cpp: In constructor ‘Kwadratowa::Kwadratowa(int)’:
macierz.cpp:101: error: no matching function for call to ‘Macierz::Macierz()’
macierz.cpp:28: note: candidates are: Macierz::Macierz(std::string)
macierz.cpp:10: note:                 Macierz::Macierz(int, int)
macierz.h:11: note:                 Macierz::Macierz(const Macierz&)

Problem pojawia sie na konstruktorze klasy Kwadratowa (nie wiem dlaczego chce wywolac Macierz::Macierz())

Kwadratowa::Kwadratowa(int wymiar)
{
    if(wymiar <= 0)
        cout << "Nieprawidlowy wymiar!" << endl;

    ilwierszy = wymiar;
    ilkolumn = wymiar;

    // inicjalizacja dynamicznej tablicy
    // dla wierszy

    // pomysl na alokacje:
    // zaalokuj wskazniki na wiersz
    // dla kazdego wiersza (wskaznika) zaalokuj kolumny
    macierz = new float*[wymiar];
    for(int i = 0; i < wymiar; i++)
        macierz[i] = new float[wymiar];
}

Co ciekawe klasa Kwadratowa nie potrzebuje takiego konstruktora i nie moge utworzyc obiektu w ten sposob:
Kwadratowa x;
Na takim efekcie mi zalezy.

Myslalem, ze konstruktory i destruktory nie sa dziedziczone, skad ten dziwny efekt?

Pozdrawiam i dziekuje za zainteresowanie,

0
Kwadratowa::Kwadratowa(int wymiar): Macierz(wymiar, wymiar)
{
//...
}

Przed wywolaniem konstruktora klasy dziedziczacej wywolywane sa konstruktory klas macierzystych. Jesli nie wskazesz go konkretnie (w liscie inicjalizacyjnej, jak powyzej) to bedzie wywolywany domyslny.

0

Dzieki, postanowilem lepiej zrozumiec co sie dzieje podczas dziedziczenia i napisalem taki program:

#include<iostream>

using namespace std;

class MojTyp {
    int zmienna;
public:
    MojTyp() {
        cout << "Wywolano konstruktor 1!" << endl;
    }
    MojTyp(int a) {}
    ~MojTyp() {
        cout << "Wywolano destruktor 1!" << endl;
    }
    void podajzmienna() {
        cout << "Podaj zmienna: ";
        cin >> zmienna;
    }
    void wyswietlzmienna() {
        cout << "Zmienna: " << zmienna << endl;
    }
};

class MojTyp1 : public MojTyp {
public:
    MojTyp1() {
        cout << "Wywolano konstruktor 2!" << endl;
    }
    ~MojTyp1() {
        cout << "Wywolano destruktor 2!" << endl;
    }
};

int main() {
    MojTyp c;
    c.podajzmienna();
    c.wyswietlzmienna();
    MojTyp1 d;
    d.podajzmienna();
    d.wyswietlzmienna();
}

Na wyjsciu otrzymuje:

Wywolano konstruktor 1!
Podaj zmienna: 6
Zmienna: 6
Wywolano konstruktor 1!
Wywolano konstruktor 2!
Podaj zmienna: 7
Zmienna: 7
Wywolano destruktor 2!
Wywolano destruktor 1!
Wywolano destruktor 1!

Zalezy mi na tym, aby wylaczyc w klasie ktora dziedziczy funkcje korzystanie z destruktorow i konstruktorow klasy pierwotnej. W jaki najprostszy sposob mozna tego dokonac.

0

Nie można i nie powinno się tak robić. Jeśli występuje u ciebie taka potrzeba, to znaczy ze źle zaprojektowałeś rozwiązanie.

0

Zaprojektuje klase tak, aby byla odpowiednio dziedziczona. Dzieki za cenne informacje i pozdrawiam.

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