用类方法更新指针的困难

问题描述 投票:0回答:1

我目前正在开展一个学校项目,其中包括开发 C++ RPG,尤其是使用 Qt。

在那之前一切都很顺利,除了我对角色的动作管理有问题,我自己解释一下。

我的角色有一组属性,包括一个 m_tile 属性,它是一个指向我也实现的 Case 对象的指针,以及一个包含 Case 对象的“Map_2”向量。关于方法,我已经实现了 go_up、go_down 等方法,允许修改角色的起始坐标。我们的想法是修改此函数,以便一方面在您进行移动(例如调用 go_down)时更新角色的坐标,并且 m_tile 指针指向 Map_2 中包含的另一个对象。也就是说,Case 对象包含使用 Qt 中的 QGraphicScene 显示的精灵(角色在地图上的位置)的路径。

下面是代码

编译器返回给我:

Personnage.cpp:244:22:错误:“Carte_2”未在此范围内声明

         m_tile = Carte_2[1];
                  ^~~~~~~

如何处理向量?

#include "Personnage.h"
#include "Drop.h"
#include "Case.h"

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>

   
    // test_1 = Case(1, 0, 0,false, false,"plop");
    // test_2 = Case(1, 0, 0,false, false,"plop");

    // test_3 = Case(1, 0, 0,false, false,"plop");

    // Carte_2.push_back(test_1);
    // Carte_2.push_back(test_2);
    // Carte_2.push_back(test_3);


    //Case& nb_1 = Carte_2[1];

    //nb_1 = Case(99, 0, 0,false, false,"prout");
    //Case Carte_2[1] = Case(1, 0, 0,false, false,"test");
    //Case objet = Case(99, 0, 0,false, false,"prout");
    //Carte[1] = Case(99, 0, 0,false, false,"prout");
    //Carte_2[1] = objet;



    Personnage::Personnage(int id)
    {
        Id = id;
        m_vie = 100;                              
        m_degats= 10;//NArme.getDegats();
        m_X_pos = 0;
        m_Y_pos = 0;
        m_niveau = 1;
        m_experience = 0;
        m_puissance = 1;
        m_est_vivant = true;
        m_sprite = "Perso";
        //m_tile = new Case(1, 0, 0,false, false,"plop"); //
        std::vector<Case> Carte_2(2,Case(1, 0, 0,false, false,"plop")); // test de la carte pour deplacements
        Carte_2[1] = Case(99, 0, 0,false, false,"prout");

        m_tile = new Case(Carte_2[0]);

    };

    //Personnage::Personnage(int id, int vieAtStart, int degatsArmeAtStart)
    //{
    //   m_vie = vieAtStart;
    //   m_degatsArme = degatsArmeAtStart;
    //   persoId = id; 
    //   X_pos = 0;
    //   Y_pos = 0;
    //   niveau = 1;
    //   experience = 0;            
    // };

    void Personnage::recevoirDegats(int nombreDegats)
    {

     m_vie = m_vie - nombreDegats;      //IL faut rajouter une fonction coup critique
    };

    void Personnage::attaquer(Personnage &cible)
    {
    cible.recevoirDegats(m_degats);         //Attention aux attribut privés
    };

    void Personnage::guerir()
    {
         m_vie = m_vie + 40;
         
         if (m_vie > 100)
         {
            m_vie = 100;
         }    
    };

    void Personnage::regen()
    {
         m_vie = 100;
           
    };



    bool Personnage::estVivant()                //tout est dans le nom
    {
    if (m_vie > 0)
        return true;
    else             
        return false;
    };

    Personnage::~Personnage()                       //destructeur
    {
                           
    };
    
    int Personnage::get_vie()
    {
       return m_vie; 
    };
    int Personnage::get_Id()
    {
       return Id; 
    };
   

    // void Personnage::se_blesser(int douleur)
    // {
    //      m_vie = m_vie - douleur;
    //      if (m_vie < 0)
    //         m_vie = 0;    
    // };
    int Personnage::get_degats()
    {
       return m_degats; 
    };

    int Personnage::get_X_pos()
    {
       return m_X_pos; 
    };

    int Personnage::get_Y_pos()
    {
       return m_Y_pos; 
    };

    int Personnage::get_niveau()
    {
       return m_niveau; 
    };

    int Personnage::get_experience()
    {
       return m_experience; 
    };

    int Personnage::get_puissance()
    {
       return m_puissance; 
    };
    bool Personnage::get_vivant()
    {
       return m_est_vivant; 
    };

    std::string Personnage::get_sprite()
    {
       return m_sprite; 
    };

    Case Personnage::get_case()
    {
       return *m_tile; 
    };

    void Personnage::set_case(Case & Case_cible)
    {
        m_tile = &Case_cible; 
    };

    void Personnage::change_niveau()
    {
        

        if ((m_experience > 0) && (m_experience < 110))
        {
            m_niveau = 1;
        }

        else if ((m_experience >= 110) && (m_experience < 650))
        {
            m_niveau = 2;
        }

        else if ((m_experience >= 650) && (m_experience < 1500))
        {
            m_niveau = 3;
        }

        else if ((m_experience >= 1500) && (m_experience < 2800))
        {
            m_niveau = 4;
        }

        else if ((m_experience >= 2800) && (m_experience < 4800))
        {
            m_niveau = 5;
        }

        else if ((m_experience >= 4800) && (m_experience < 7300))
        {
            m_niveau = 6;
        }

        else if ((m_experience >= 7300) && (m_experience < 10500))
        {
            m_niveau = 7;
        }

        else if ((m_experience >= 10500) && (m_experience < 14500))
        {
            m_niveau = 8;
        }

        else if ((m_experience >= 14500) && (m_experience < 19200))
        {
            m_niveau = 9;
        }

        else 
        {
            m_niveau = 10;
        }
    };

    void Personnage::go_up()
    {
        if ((m_Y_pos >0) &&(m_Y_pos<=30))
        {
            m_Y_pos = m_Y_pos-1 ; 

        }

        else
        {
            m_Y_pos = m_Y_pos;
        }
    };


    void Personnage::go_down()
    {
        if ((m_Y_pos >=0) &&(m_Y_pos<30))
        {
            m_Y_pos = m_Y_pos+1 ;
            m_tile = Carte_2[1]; 

        }

        else
        {
            m_Y_pos = m_Y_pos;
        }
    };

    void Personnage::go_left()
    {
        if ((m_X_pos >0) &&(m_X_pos<=30))
        {
            m_X_pos = m_X_pos-1 ; 

        }

        else
        {
            m_X_pos = m_X_pos;
        }
    };


    void Personnage::go_right()
    {
        if ((m_X_pos >=0) &&(m_X_pos<30))
        {
            m_X_pos = m_X_pos+1 ; 

        }

        else
        {
            m_X_pos = m_X_pos;
        }


    };



//////////////////////////////////////////////////////////

#include "Case.h"

#include <iostream>
#include <cstdlib>
#include <string>

    Case::Case(int numero, int X_loc, int Y_loc, bool combat, bool barriere,std::string image)
    {
        Numero = numero;
        m_X_localisation = X_loc; // voir protected
        m_Y_localisation = Y_loc; // a changer
        combat_ou_non = combat;
        obstacle = barriere;
        m_sprite = image;

    };

    //Personnage::Personnage(int id, int vieAtStart, int degatsArmeAtStart)
    //{
    //   m_vie = vieAtStart;
    //   m_degatsArme = degatsArmeAtStart;
    //   persoId = id; 
    //   X_pos = 0;
    //   Y_pos = 0;
    //   niveau = 1;
    //   experience = 0;            
    // };

    int Case::get_numero()
    {
       return Numero; 
    };

    int Case::get_X_localisation()
    {
       return m_X_localisation; 
    };

    int Case::get_Y_localisation()
    {
       return m_Y_localisation; 
    };

    bool Case::get_combat_ou_non()
    {
        return combat_ou_non;
    };

    bool Case::get_obstacle()
    {
        return obstacle;
    };

    std::string Case::get_sprite()
    {
       return m_sprite; 
    };

    Case::~Case()                       //destructeur
    {
                           
    };
    
    

////////////////////////////////////////////////////////////



#include "Rand.h"
#include "Personnage.h"
#include "Guerrier.h"
#include "Magicien.h"
#include "Voleur.h"
#include "Squelette.h"
#include "Araignee.h"
#include "Gobelin.h"
#include "Boss.h"
#include "Case.h"
#include <time.h>
#include "Drop.h"
#include "Combat.h"
#include <vector>



//#include "Rand.h" // permet de faire le lien avec le .h 


#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;


int main()
{

    // std::vector<Case> Carte(2,Case(1, 0, 0,false, false,"plop")); // test de la carte

    // std::cout << " Numero de Case_1 : " << Carte[0].get_numero() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[0].get_X_localisation() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[0].get_Y_localisation() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[0].get_combat_ou_non() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[0].get_obstacle() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[0].get_sprite() << std::endl;

    // std::cout << "------------------------- " << std::endl;

    // Carte[1] = Case(1, 0, 0,false, false,"test");
    // std::cout << " Numero de Case_1 : " << Carte[1].get_numero() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[1].get_X_localisation() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[1].get_Y_localisation() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[1].get_combat_ou_non() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[1].get_obstacle() << std::endl;
    // std::cout << " Numero de Case_1 : " << Carte[1].get_sprite() << std::endl;

    // std::cout << "------------------------- " << std::endl;

    // test de la case de depart inclue dans personnage ///



    int A = rand_a_b(0,6);
    std::cout << "A vaut:" << A << std::endl;

    Guerrier Heros = Guerrier(1);
    Personnage Mechant = Personnage(2);
    Magicien Merlin = Magicien(3);
    Voleur Robin = Voleur(4);
    Squelette Oscar = Squelette(11);
    Araignee Lucifer = Araignee(12);
    Gobelin Marcel = Gobelin(13);
    Boss Jojo = Boss(14);

    std::cout << " Numero de Case initiale du personnage : " << Heros.get_case().get_numero() << std::endl;

    std::cout << "------------------------- " << std::endl;
    //Heros.set_case(Carte_2[1]);

    std::cout << " Numero de Case initiale du personnage : " << Heros.get_case().get_numero() << std::endl;
    std::cout << " Sprite initiale du personnage : " << Heros.get_case().get_sprite() << std::endl;

    // std::cout << "Id de Heros est:" << Heros.get_Id() << std::endl;
    // std::cout << "Vie de Heros est:" << Heros.get_vie() << std::endl;
    // std::cout << "Degats de Heros est:" << Heros.get_degats() << std::endl;
    // std::cout << "X_pos de Heros est:" << Heros.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Heros est:" << Heros.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Heros est:" << Heros.get_niveau() << std::endl;
    // std::cout << "Experience de Heros est:" << Heros.get_experience() << std::endl;
    // std::cout << "Puissance de Heros est:" << Heros.get_puissance() << std::endl;
    // std::cout << "Vivant de Heros est:" << Heros.get_vivant() << std::endl;
    // std::cout << "Sprite de Heros est:" << Heros.get_sprite() << std::endl;

    // std::cout << "Id de Mechant est:" << Mechant.get_Id() << std::endl;
    // std::cout << "Vie de Mechant est:" << Mechant.get_vie() << std::endl;
    // std::cout << "Degats de Mechant est:" << Mechant.get_degats() << std::endl;
    // std::cout << "X_pos de Mechant est:" << Mechant.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Mechant est:" << Mechant.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Mechant est:" << Mechant.get_niveau() << std::endl;
    // std::cout << "Experience de Mechant est:" << Mechant.get_experience() << std::endl;
    // std::cout << "Puissance de Mechant est:" << Mechant.get_puissance() << std::endl;
    // std::cout << "Vivant de Mechant est:" << Mechant.get_vivant() << std::endl;
    // std::cout << "Sprite de Mechant est:" << Mechant.get_sprite() << std::endl;


    Heros.charge(Mechant,Heros);

    // std::cout << "Id de Heros est:" << Heros.get_Id() << std::endl;
    // std::cout << "Vie de Heros est:" << Heros.get_vie() << std::endl;
    // std::cout << "Degats de Heros est:" << Heros.get_degats() << std::endl;
    // std::cout << "X_pos de Heros est:" << Heros.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Heros est:" << Heros.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Heros est:" << Heros.get_niveau() << std::endl;
    // std::cout << "Experience de Heros est:" << Heros.get_experience() << std::endl;
    // std::cout << "Puissance de Heros est:" << Heros.get_puissance() << std::endl;
    // std::cout << "Vivant de Heros est:" << Heros.get_vivant() << std::endl;
    // std::cout << "Sprite de Heros est:" << Heros.get_sprite() << std::endl;

    // std::cout << "Id de Mechant est:" << Mechant.get_Id() << std::endl;
    // std::cout << "Vie de Mechant est:" << Mechant.get_vie() << std::endl;
    // std::cout << "Degats de Mechant est:" << Mechant.get_degats() << std::endl;
    // std::cout << "X_pos de Mechant est:" << Mechant.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Mechant est:" << Mechant.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Mechant est:" << Mechant.get_niveau() << std::endl;
    // std::cout << "Experience de Mechant est:" << Mechant.get_experience() << std::endl;
    // std::cout << "Puissance de Mechant est:" << Mechant.get_puissance() << std::endl;
    // std::cout << "Vivant de Mechant est:" << Mechant.get_vivant() << std::endl;
    // std::cout << "Sprite de Mechant est:" << Mechant.get_sprite() << std::endl;

    // std::cout << "Id de Merlin est:" << Merlin.get_Id() << std::endl;
    // std::cout << "Vie de Merlin est:" << Merlin.get_vie() << std::endl;
    // std::cout << "Degats de Merlin est:" << Merlin.get_degats() << std::endl;
    // std::cout << "X_pos de Merlin est:" << Merlin.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Merlin est:" << Merlin.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Merlin est:" << Merlin.get_niveau() << std::endl;
    // std::cout << "Experience de Merlin est:" << Merlin.get_experience() << std::endl;
    // std::cout << "Puissance de Merlin est:" << Merlin.get_puissance() << std::endl;
    // std::cout << "Vivant de Merlin est:" << Merlin.get_vivant() << std::endl;
    // std::cout << "Sprite de Merlin est:" << Merlin.get_sprite() << std::endl;

    Merlin.BouleDeFeu(Mechant);

    // std::cout << "Id de Mechant est:" << Mechant.get_Id() << std::endl;
    // std::cout << "Vie de Mechant est:" << Mechant.get_vie() << std::endl;
    // std::cout << "Degats de Mechant est:" << Mechant.get_degats() << std::endl;
    // std::cout << "X_pos de Mechant est:" << Mechant.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Mechant est:" << Mechant.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Mechant est:" << Mechant.get_niveau() << std::endl;
    // std::cout << "Experience de Mechant est:" << Mechant.get_experience() << std::endl;
    // std::cout << "Puissance de Mechant est:" << Mechant.get_puissance() << std::endl;
    // std::cout << "Vivant de Mechant est:" << Mechant.get_vivant() << std::endl;
    // std::cout << "Sprite de Mechant est:" << Mechant.get_sprite() << std::endl;

    // std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    // std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    // std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    // std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    // std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    // std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    // std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    // std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Robin.sournoiserie(Mechant);

    // std::cout << "Id de Mechant est:" << Mechant.get_Id() << std::endl;
    // std::cout << "Vie de Mechant est:" << Mechant.get_vie() << std::endl;
    // std::cout << "Degats de Mechant est:" << Mechant.get_degats() << std::endl;
    // std::cout << "X_pos de Mechant est:" << Mechant.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Mechant est:" << Mechant.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Mechant est:" << Mechant.get_niveau() << std::endl;
    // std::cout << "Experience de Mechant est:" << Mechant.get_experience() << std::endl;
    // std::cout << "Puissance de Mechant est:" << Mechant.get_puissance() << std::endl;
    // std::cout << "Vivant de Mechant est:" << Mechant.get_vivant() << std::endl;
    // std::cout << "Sprite de Mechant est:" << Mechant.get_sprite() << std::endl;

    // std::cout << "Id de Oscar est:" << Oscar.get_Id() << std::endl;
    // std::cout << "Vie de Oscar est:" << Oscar.get_vie() << std::endl;
    // std::cout << "Degats de Oscar est:" << Oscar.get_degats() << std::endl;
    // std::cout << "X_pos de Oscar est:" << Oscar.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Oscar est:" << Oscar.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Oscar est:" << Oscar.get_niveau() << std::endl;
    // std::cout << "Experience de Oscar est:" << Oscar.get_experience() << std::endl;
    // std::cout << "Puissance de Oscar est:" << Oscar.get_puissance() << std::endl;
    // std::cout << "Vivant de Oscar est:" << Oscar.get_vivant() << std::endl;
    // std::cout << "Sprite de Oscar est:" << Oscar.get_sprite() << std::endl;

    Oscar.coup_de_femur(Robin);

    // std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    // std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    // std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    // std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    // std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    // std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    // std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    // std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Lucifer.morsure(Robin);

    // std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    // std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    // std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    // std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    // std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    // std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    // std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    // std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Marcel.coup_de_dague(Robin);

    // std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    // std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    // std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    // std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    // std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    // std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    // std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    // std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    // std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    // std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Jojo.coup_fatal(Robin);
    std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Drop(Robin,Jojo);

    std::cout << "Id de Robin est:" << Robin.get_Id() << std::endl;
    std::cout << "Vie de Robin est:" << Robin.get_vie() << std::endl;
    std::cout << "Degats de Robin est:" << Robin.get_degats() << std::endl;
    std::cout << "X_pos de Robin est:" << Robin.get_X_pos() << std::endl;
    std::cout << "Y_pos de Robin est:" << Robin.get_Y_pos() << std::endl;
    std::cout << "Niveau de Robin est:" << Robin.get_niveau() << std::endl;
    std::cout << "Experience de Robin est:" << Robin.get_experience() << std::endl;
    std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;
    std::cout << "Vivant de Robin est:" << Robin.get_vivant() << std::endl;
    std::cout << "Sprite de Robin est:" << Robin.get_sprite() << std::endl;

    Combat(Robin,Oscar);

    std::cout << "Puissance de Robin est:" << Robin.get_puissance() << std::endl;


}
c++ class vector scope
1个回答
0
投票

std::vector<Case> Carte_2
在构造函数中被声明为局部变量,因此当构造函数结束时,该变量将被永久删除。

所以

Personnage::go_down()
无法访问它。我怀疑您希望
Carte_2
成为
Personnage
class
的属性。

如果

Carte_2
正如您所评论的那样是一个全局变量,那么:

const std::vector<Case>& Carte_2()
{
    static std::vector<Case> vect = { Case(1, 0, 0,false, false,"plop"),
                                      Case(99, 0, 0,false, false,"prout") };
    return vect;
}

然后,在

Personnage::Personnage
中执行:

m_tile = &(Carte_2()[0]); // if m_tile is a Case*

在 Personnage::go_down() 中,执行:

m_tile = &(Carte_2()[1]); // if m_tile is a Case*
© www.soinside.com 2019 - 2024. All rights reserved.