i've been trying to figure it out by my self but I cant figure it out, I've try to implement a doubly circular linked list template class, in purpose to create a menu for an app with SFML.
I dont know why but when i implement an instance of CDblLinkedList (int,string,sf::Text) it work without any error, but when i try to insert in CDblLinkedList an instance of CSubMenu i got an error Exception has occurred. EXC_BAD_ACCESS (code=1, address=0x170). When i debug it i've saw that at the second call of the destructor ~CDblLinkedList(), head->GetPrev()->SetNext(nullptr); generate this error because the prev pointer of the head is equal to nullptr.
CNode.h
#pragma once
template <typename T>
class CNode{
    private:
        CNode<T>*prev=nullptr;
        T data;
        CNode<T>*next=nullptr;
    public:
        CNode(T p_data);
        void SetNext(CNode<T>*p_next){next=p_next;};
        void SetPrev(CNode<T>*p_prev){prev=p_prev;};
        CNode<T>* GetNext(void){return(next);};
        CNode<T>* GetPrev(void){return(prev);};
        T* GetData(void){return(&data);};
};
template <typename T>
CNode<T>::CNode(T p_data):data(p_data){
   // data=p_data;
}
CDblLinkedList.h
#pragma once
#include "CNode.h"
#include <iostream>
template <typename T>
class CDblLinkedList{
    private:
        CNode<T>*head=nullptr,*current=nullptr;
    public:
        CDblLinkedList();
        void Insert(T p_data);
        void Next();
        void Prev();
        CNode<T>*GetCurr(void){return(current);};
        CNode<T>*GetHead(void){return(head);};
        ~CDblLinkedList();
};
template<typename T>
CDblLinkedList<T>::CDblLinkedList(){
}
template<typename T>
void CDblLinkedList<T>::Insert(T p_data){
    CNode<T> * dummy=new CNode<T>(p_data);
    if(!head){
        head=dummy;
        head->SetNext(head);
        head->SetPrev(head);
        current=head;
    }else{
        dummy->SetPrev(head->GetPrev());
        dummy->SetNext(head);
        head->GetPrev()->SetNext(dummy);
        head->SetPrev(dummy);
    }
}
template<typename T>
void CDblLinkedList<T>::Next(){
    current=current->GetNext();
}
template<typename T>
void CDblLinkedList<T>::Prev(){
    current=current->GetPrev();
}
template<typename T>
CDblLinkedList<T>::~CDblLinkedList(){
    if(head){
       head->GetPrev()->SetNext(nullptr);
        CNode<T>* dummy=nullptr;
        while(head){
            dummy=head;
            head=head->GetNext();
            delete dummy;
            dummy=nullptr;
        }
        head=nullptr;
        current=nullptr;
    }
}
main.cpp
#include<SFML/Graphics.hpp>
#include "CSubMenu.h"
int main(){
    sf::RenderWindow window({ 1600 ,900 }, "test");
    sf::Font font;
    font.loadFromFile("./assets/fonts/Oswald-Bold.ttf");
    CSubMenu left(300,450,"AlgoText",font,&window);
    left.AddChoice("1- BFS");
    left.AddChoice("2- DFS");
    left.AddChoice("3- A*");
    CDblLinkedList<CSubMenu>list;
    list.Insert(left);
    return 0;
}
I've try to create separate CSubMenu instance it work, but not when i try to insert one of them in a CDblLinkedList instance.
Thank you in advance :)
 
    