0

Good evening, i am implementing code based on the following class diagram enter image description here

I am obviously facing a circular dependency problem because Document and his children use pointer to Ambit and vice-versa; i've read resolved questions here on stack overflow and i followed this guide in the proper section but the code still shows problems, in particular doesn't found references to constructor and destructor. I want to point out that Document and Ambit are pure abstract class. To be clearer the code is as follow:

  • Document.h
    #ifndef DOCUMENT_H_
    #define DOCUMENT_H_

    class Ambit; //forward declaration

    class Document{

    public:
        Document();
        virtual ~Document();
        virtual void addDocument(Document*);
        virtual void showSelf();
        virtual void showRelated();
        virtual void setAnnotation(Ambit*);
    };

    #endif /* DOCUMENT_H_ */
  • Ambit.h
    #ifndef AMBIT_H_
    #define AMBIT_H_

    class Document; //forward declaration

    class Ambit{

    public:
        Ambit();
        virtual ~Ambit();
        virtual void addAmbit(Ambit*);
        virtual void showSelfA();
        virtual void showRelatedA();
        virtual void setAnnotationA(Document*);
    };

    #endif /* AMBIT_H_ */
  • CompAmbit.h
    #ifndef COMPAMBIT_H_
    #define COMPAMBIT_H_

    #include <iostream>
    #include <vector>
    #include "Ambit.h"
    using namespace std;

    class CompAmbit : public Ambit{

    private:
        string ambName;
        Document* annotation;
        vector<Ambit*> ambitVec;
    public:
        CompAmbit(string);
        ~CompAmbit();
        void addAmbit(Ambit*);
        void showSelfA();
        void showRelatedA();
        void setAnnotationA(Document*);
    };

    #endif /* COMPAMBIT_H_ */
  • CompAmbit.cpp
    #include<iostream>
    #include<vector>
    #include "CompAmbit.h"
    #include "Document.h" //added header to Document for the knowledge of showSelf()
    using namespace std;

    CompAmbit::CompAmbit(string newName){ // @suppress("Class members should be properly initialized")
        ambName = newName;
    };

    CompAmbit::~CompAmbit(){};

    void CompAmbit::addAmbit(Ambit* newAmbit){
        ambitVec.push_back(newAmbit);
    };

    void CompAmbit::setAnnotationA(Document* newAnnotation){
        annotation = newAnnotation;
    };

    void CompAmbit::showSelfA(){
        for(unsigned int i = 0; i<ambitVec.size(); i++ ){
            ambitVec[i]->showSelfA();
        };
    };

    void CompAmbit::showRelatedA(){
        annotation->showSelf();
    };

Section.h and Section.cpp are analogous to CompAmbit.


As you can see i need mutual references to call the function showSelf() (or showSelfA()) using the pointer in the annotation variable.
I've used forward declarations and i have added in CompAmbit.cpp the header to Document for the knowledge of showSelf(). I think i am acting good till now but as i compile i receive the following errors:
CompAmbit.cpp:14: undefined reference to Ambit::Ambit() //14 is line of CompAmbit constructor
CompAmbit.cpp:14: undefined reference to Ambit::~Ambit()
CompAmbit.cpp:18: undefined reference to Ambit::~Ambit() //18 is line of CompAmbit destructor
and analogous errors for Section.
Where am i doing wrong?
note: i have omitted leaf code to keep the question short.
EDIT: i forgot to say that errors pop up just after the addition of #include "Document.h" in CompAmbit.cpp

EDIT: by reading this post What is an undefined reference/unresolved external symbol error and how do I fix it? i figured out that i did not define constructor and destructor; for some reason i thought that pure virtual classes did not require any definition; i resolved just by replacing Ambit(); with Ambit(){};, same for the destructor and in the Document.h file.

francesco
  • 57
  • 2
  • 10
  • How are you compiling/linking your program? afaik undefined reference is a linker error and wouldnt result from a circular include. Did you implement Ambit ctor dtor? are they linked correctly? – Borgleader Sep 13 '20 at 17:26
  • Unrelated:Read up on [the Rule of Three (and friends)](https://en.cppreference.com/w/cpp/language/rule_of_three). Currently your classes will break badly if accidentally copied. – user4581301 Sep 13 '20 at 17:26
  • How are you linking the compiled unit of `Ambit.cpp`? – πάντα ῥεῖ Sep 13 '20 at 17:27
  • It's a linker error for sure? I am asking because, as i write in the EDIT, the errors pop up after the addition of #include "Document.h" in CompAmbit.cpp. anyway i don't have an Ambit.cpp. – francesco Sep 14 '20 at 07:55
  • As i said in the last edit i figured out that i made a huge mistake; thanks everyone who answered for the hints. – francesco Sep 14 '20 at 09:32

0 Answers0