Okej, kawa wypita. :P
Skompilowałem sobie Twój kod, uzupełniony o rzeczy konieczne:
#include <iostream>
#include <string>
#include <memory>
#include <vector>
using namespace std;
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;
}
class Panelclass {
public:
void addObject(string className, string name);
int searchObject(string name, string className);
string removeObject(string name, string className);
string modifyObject(string name,string info,string className);
int classToNumber(string name) { return 1; }
protected:
vector <unique_ptr<Aclass>> classList;
};
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)
{
std::cout << "In: " << __PRETTY_FUNCTION__ << "\n" << classList[i]->getString() << "\n";
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";
}
int main() {
Panelclass p;
string a = "Eclass", b = "bejb";
p.addObject(a, b);
std::cout << "found index: `" << p.searchObject(b, a) << "`";
}
I wyszło mi:
$ g++ --pedantic -Wall -Wextra hier.cpp -Wfatal-errors && ./a
hier.cpp: In member function 'virtual std::__cxx11::string Aclass::getString()':
hier.cpp:50:28: warning: no return statement in function returning non-void [-Wreturn-type]
string Aclass::getString(){};
^
hier.cpp: At global scope:
hier.cpp:50:29: warning: extra ';' [-Wpedantic]
string Aclass::getString(){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Aclass::getStringToSave()':
hier.cpp:51:34: warning: no return statement in function returning non-void [-Wreturn-type]
string Aclass::getStringToSave(){};
^
hier.cpp: At global scope:
hier.cpp:51:35: warning: extra ';' [-Wpedantic]
string Aclass::getStringToSave(){};
^
hier.cpp: In member function 'virtual void Aclass::setClassName(std::__cxx11::string)':
hier.cpp:52:34: warning: unused parameter 'AclassName' [-Wunused-parameter]
void Aclass::setClassName(string AclassName){};
^~~~~~~~~~
hier.cpp: At global scope:
hier.cpp:52:47: warning: extra ';' [-Wpedantic]
void Aclass::setClassName(string AclassName){};
^
hier.cpp: In member function 'virtual void Aclass::setInfo(std::__cxx11::string)':
hier.cpp:53:29: warning: unused parameter 'aInfo' [-Wunused-parameter]
void Aclass::setInfo(string aInfo){};
^~~~~
hier.cpp: At global scope:
hier.cpp:53:37: warning: extra ';' [-Wpedantic]
void Aclass::setInfo(string aInfo){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Aclass::getName()':
hier.cpp:54:26: warning: no return statement in function returning non-void [-Wreturn-type]
string Aclass::getName(){};
^
hier.cpp: At global scope:
hier.cpp:54:27: warning: extra ';' [-Wpedantic]
string Aclass::getName(){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Aclass::getClassname()':
hier.cpp:55:31: warning: no return statement in function returning non-void [-Wreturn-type]
string Aclass::getClassname(){};
^
hier.cpp: At global scope:
hier.cpp:55:32: warning: extra ';' [-Wpedantic]
string Aclass::getClassname(){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Bclass::getString()':
hier.cpp:58:28: warning: no return statement in function returning non-void [-Wreturn-type]
string Bclass::getString(){};
^
hier.cpp: At global scope:
hier.cpp:58:29: warning: extra ';' [-Wpedantic]
string Bclass::getString(){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Bclass::getStringToSave()':
hier.cpp:59:34: warning: no return statement in function returning non-void [-Wreturn-type]
string Bclass::getStringToSave(){};
^
hier.cpp: At global scope:
hier.cpp:59:35: warning: extra ';' [-Wpedantic]
string Bclass::getStringToSave(){};
^
hier.cpp: In member function 'virtual void Bclass::setClassName(std::__cxx11::string)':
hier.cpp:60:34: warning: unused parameter 'AclassName' [-Wunused-parameter]
void Bclass::setClassName(string AclassName){};
^~~~~~~~~~
hier.cpp: At global scope:
hier.cpp:60:47: warning: extra ';' [-Wpedantic]
void Bclass::setClassName(string AclassName){};
^
hier.cpp: In member function 'virtual void Bclass::setInfo(std::__cxx11::string)':
hier.cpp:61:29: warning: unused parameter 'aInfo' [-Wunused-parameter]
void Bclass::setInfo(string aInfo){};
^~~~~
hier.cpp: At global scope:
hier.cpp:61:37: warning: extra ';' [-Wpedantic]
void Bclass::setInfo(string aInfo){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Bclass::getName()':
hier.cpp:62:26: warning: no return statement in function returning non-void [-Wreturn-type]
string Bclass::getName(){};
^
hier.cpp: At global scope:
hier.cpp:62:27: warning: extra ';' [-Wpedantic]
string Bclass::getName(){};
^
hier.cpp: In member function 'virtual std::__cxx11::string Bclass::getClassname()':
hier.cpp:63:31: warning: no return statement in function returning non-void [-Wreturn-type]
string Bclass::getClassname(){};
^
hier.cpp: At global scope:
hier.cpp:63:32: warning: extra ';' [-Wpedantic]
string Bclass::getClassname(){};
^
hier.cpp: In member function 'int Panelclass::classToNumber(std::__cxx11::string)':
hier.cpp:104:30: warning: unused parameter 'name' [-Wunused-parameter]
int classToNumber(string name) { return 1; }
^~~~
hier.cpp: In member function 'int Panelclass::searchObject(std::__cxx11::string, std::__cxx11::string)': hier.cpp:127:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<classList.size();i++)
~^~~~~~~~~~~~~~~~~
In: int Panelclass::searchObject(std::__cxx11::string, std::__cxx11::string)
nazwa klasy: Eclass nazwa: bejb info: brak informacji
found index: `0`
No "niby" działa. To jednak nie wiem o co chodzi.
Te warningi to sobie weź do serca. W funkcji zwracającej wartość możesz nie mieć żadnego returna i to się skompiluje (bo i powinno!) - ale jeżeli w trakcie wykonywania kodu kiedykolwiek program znajdzie się w sytuacji, że "kontrola" dojdzie do końca ciała funkcji... To masz Undefined Behavior, demony z nosa, itd.