Inicjalizacja konstruktora różnych klas a wskaźnik

0

Witam.

Posiadam dwie klasy w oddzielnych plikach. W konstruktorach tych klas próbuję zainicjować wskaźniki, które wskazują naprzemiennie na te klasy. Program kompiluje się, ale po jego uruchomieniu wywala "naruszenie pamięci". Jeśli zakomentuje ptr_A lub ptr_B program uruchamia się normalnie.

Jak widać nie jestem ekspertem w klasach i wskaźnikach. Podejrzewam, że problem polega na tym, że w konstruktorze ClassA tworzę nową instancję ClassB i przypisuje jej adres do wskaźnika, a z kolei w konstruktorze ClassB tworzę nową instancję ClassA, to się zapętla i stąd "naruszenie pamięci". Proszę o potwierdzenie lub dokładne wyjaśnienie tego problemu. Jak można inaczej rozwiązać ten problem?

 #ifndef CLASSA_H
#define CLASSA_H

#include <string>
#include "ClassB.h"
using namespace std;

class ClassB;
class ClassA
{
    public:
        ClassA();
        ~ClassA();

        void run();
        void ShowStringFromClassB();
        string getStringA();

    protected:

    private:
        string stringA;
        ClassB* ptr_B;
};

#endif // CLASSA_H
 #include "ClassA.h"
#include <iostream>

ClassA::ClassA()
{
    stringA = "Klasa A\n";
    //ptr_B = new ClassB();
    cout << "ptr_B: " << ptr_B << endl;
}
 #ifndef CLASSB_H
#define CLASSB_H

#include <iostream>
#include <string>
#include "ClassA.h"
using namespace std;

class ClassA;
class ClassB
{
    public:
        ClassB();
        ~ClassB();
        void ShowStringFromClassA();
        string getStringB();

    protected:

    private:
    string stringB;
    ClassA* ptr_A;
};

#endif // CLASSB_H

 #include "ClassB.h"

ClassB::ClassB()
{
    stringB = "Klasa B\n";
    ptr_A = new ClassA;
    cout << "ptr_A: " << ptr_A<< endl;
}
 #include <iostream>
#include "ClassA.h"

using namespace std;

int main()
{
    ClassA klasaA;
    klasaA.run();
    return 0;
}
2

Klasyka, inkludujesz ClassA w nagłówku ClassB oraz ClassB w ClassA, strażnik nagłówka nic tu nie pomoże. W nagłówkach pozostaw tylko deklaracje zapowiadające a inkludy przenieś do *.cpp. Generalnie chciałem się już rozpisywać jak to wszystko działa, ale raczej nie zrobię tego lepiej niż ten gość na SO . Miłej lektury.

0

Mógłbyś zrobić klasę Class po której będą dziedziczyć klasy ClassA i ClassB i która będzie przechowywać informację jaka ci jest potrzebna, napis czy jakoś tak. Klasy ClassA i ClassB będą przechowywać wskaźnik na klasę Class i pozbędziesz się "nieskończonej pętli includowania".
PS. dziwne że to ci się kompiluje!

3

Z innej beczki: nigdy nie pisz using namespace w plikach nagłówkowych. A nawet pojedynczych using xxx np. using std::string.

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