zwracanie wartości

0

witam,
Napisałem klasy o podanej hierarchii dziedziczenia: A->B->E
klasy A i B nie mogą tworzyć obiektów. Dopóki Klasa E tworzyła sama pola name i className wszystko działało natomiast zmieniłęm że Klasa E dziedziczy name po A oraz className po B i program się wysypuje. Obiekty klasy liścia zapisuje w wektorze (<vector>). Obiekt jest dodawany normalnie natomiast jeśli próbuje zwrócić nazwę tego obiektu program się wysypuje. Dodam jeszcze, że klasa B dziedziczy wirtualnie po a ponieważ potem mam wielokrotne dziedziczenie po innych klasach.


class Aclass
{
protected:
    string className;
public:
virtual string getClassname();
virtual string getName();
virtual  string getStringToSave();
virtual void setClassName(string AclassName);
virtual void setInfo(string aInfo);
virtual  string getString();
};

class Bclass
: public virtual Aclass
{
protected:
    string name;
    string info;

public:
virtual string getClassname();
virtual string getName();
virtual  string getStringToSave();
virtual void setClassName(string AclassName);
virtual void setInfo(string aInfo);
virtual  string getString();
};

class Eclass
: public Bclass
{
public:
    string getName();
    string getClassname();
    Eclass(string name);
    string getStringToSave();
    void setClassName(string AclassName);
    void setInfo(string aInfo);
    string getString();
};

string Aclass::getString(){};
string Aclass::getStringToSave(){};
void Aclass::setClassName(string AclassName){};
void Aclass::setInfo(string aInfo){};
string Aclass::getName(){};
string Aclass::getClassname(){};

string Bclass::getString(){};
string Bclass::getStringToSave(){};
void Bclass::setClassName(string AclassName){};
void Bclass::setInfo(string aInfo){};
string Bclass::getName(){};
string Bclass::getClassname(){};

Eclass::Eclass(string name)
    {
        setClassName("Eclass");
        this->name = name;
        this->info = "brak informacji";
    }
string Eclass:: getStringToSave()
    {
        return className + "\t" + name + "\t" + info+ "\t";
    }

string Eclass:: getString()
    {
        return "nazwa klasy: " + className +" nazwa: " + name + " info: " + info;
    }
void Eclass::setClassName(string AclassName)
    {
        className=AclassName;
    }
void Eclass::setInfo(string aInfo)
    {
        this->info = aInfo;
    }
string Eclass::getName()
    {
        return this->name;
    }
string Eclass::getClassname()
    {
        return this->className;
    }
0

dodatkowo mam utworzoną klasę P w której mam ten oto właśnie vector do przechowywania tych obiektów. Poza tym wektorem w main mogę tworzyć obiekty normalnie i odczytywać z nich dane natomiast jak dodam je do vector to metody tamtych obiektów zapisanych w vector nie chcą mi zwrócić wartości.

oto jej funkcje


 void Panelclass:: addObject(string className,string name)
    {
        int classNum = classToNumber(className);
        switch(classNum)
        {
        case 1:{classList.emplace_back(new Eclass(name));break;}
        case 2:{classList.emplace_back(new Fclass(name));break;}
        case 3:{classList.emplace_back(new Gclass(name));break;}
        case 4:{classList.emplace_back(new Jclass(name));break;}
        case 5:{classList.emplace_back(new Kclass(name));break;}
        case 6:{classList.emplace_back(new Iclass(name));break;}
        }

    }

    int Panelclass:: searchObject(string name,string className)                   //szuka obiekt po nazwie i zwraca jego index w classList
    {
        for(int i=0;i<classList.size();i++)
        {
            if(classList[i]->getName()==name&&classList[i]->getClassname()==className)
            {

                return i;
            }
        }
        return -1;
    }

    string Panelclass:: removeObject(string name,string className)                  //usuwa obiekt na podstawie jego nazwy
    {
        int index=searchObject(name,className);
        if(index == -1)
        {
            return "nie ma takiego obiektu";
        }
        classList.erase(classList.begin()+index);
        return "usunieto";
    }

    string Panelclass:: modifyObject(string name,string info,string className)      //otrzymuje nazwe obiektu i zmienia jego informacje
    {
        int index = searchObject(name,className);
        if(index == -1){return "blad";}
        classList[index]->setInfo(info);
        return "zmodyfikowano";
    }
0

jak utworzę vector a main i dodam do niego obiekt tą samą metodą to również nie działa. To wina vector? jak można to naprawić? Użycie vector bardzo ułatwiłoby mi w tym przypadku

0

na pewno nie jest to wina vector.

Dla mnie problemem jest wyjasnienie problemu oraz tona nieczytelnego kodu.

Czytalem to dwa razy i za kazdym razem mialem ochote powiedziec tylko jedno "bierz debugger i sprawdzaj co masz nie tak"

Czy jestes w stanie zadac pytanie w 20 slowach oraz dac kod w max 20 linijkach (ktory jest czytelny) opisujacy Twoj problem?

0

Jestem dopiero początkującym programistą .Przepraszam trochę za haos spróbuje:
mam klasy które wstawiłęm. W klasie PanelClass mam metody służące do zapisywania usuwania oraz edycji vectora classList. W nim przechowuję obiekty klasy E. Dodawanie obiektu do vectora przebiega prawidłowo, natomiast jeśli próbuję się odwołać do metody obiektu zapisanego w nim (np. getString) to program wywołuje funkcje (sprawdzałem) natomiast nie chce mi zwrócić wartości które zawiera obiekt. Dla porównania w main stworzyłem sam obiekt klasy E i próbowałem zrobić to samo i działało.

Dodam jeszcze że na początku klasa E nie dziedziczyła pól po wyższych klasach tylko tworzyła je u siebie i działało wszystko włącznie z operacjami na niej w wektorze w klasie PanelClass.

0

w gruncie rzeczy chodzi mi o to że po dodaniu tego dziedziczonego pola (protected) funkcje z tego obiektu dodane do vectora jakby tracą do niego dostęp. W main natomiast mają go dalej.

0

Jak masz zadeklarowany ten vector wskaźników? Bo coś mi wyciekiem pamięci pachnie.

Podałeś to wszystko a nie podałeś jak próbujesz wywoływać te funkcje, ani działającej ani żadnej innej wersji. :P Poza tym, jak sprawdzałeś?

0

Dobra zacznę od początku i postaram się mniej haotycznie. Mam strukturę klas: A->B->E. funkcje deklaruje w klasie A, W poprzedniej wersji pola tworzyłęm prywatnie i tylko w klasie E i wtedy wszystko działało. Teraz pola deklaruję natomiast jedno w klasie A oraz jedno w B oba są typu protected. Klasa E dziedziczy więc 1 pole protected po A 1 pole protected po B oraz metody po A. Obiekty klasy E przechowuję w innej klasie P która ma vector prywatny o nazwie classList oraz metody typu add remove i modify do obsługi obiektów klasy E które są dodawane do tego vectora. Problem pojawia się gdy wywołuję metodę search klasy Panel ponieważ odwołuje się ona do metody getName klasy E. Metoda jest wywoływana bo sprawdzałem, program jednak się wysypuje ponieważ wygląda to tak jakby nie mógł zwrócić pola name które jest dziedziczone prywatnie po klasie A i zmienianie w konstruktorze klasy E na inną wartość. Nie wiem dokłądnie który kawałęk kodu wkleić więc napiszcie co będzie najistotniejsze :)

0

vector <unique_ptr<aclass>> classList;

funkcję wywołuje następująco

    int Panelclass:: searchObject(string name,string className)                   //szuka obiekt po nazwie i zwraca jego index w classList
    {
        for(int i=0;i<classList.size();i++)
        {
            if(classList[i]->getName()==name&&classList[i]->getClassname()==className)
            {

                return i;
            }
        }
        return -1;
    } 

sprawdzałem poprzez dodanie cout przed return this->name;


string Eclass::getClassname()
    {
        return this->className;
    }
0

jak działały wywoływałem je dokładnie tak samo jedyna zmiana w programie to tylko te pola które teraz są dziedziczone po A i B były wtedy tworzone w E:)

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