@Santosh Reddy: That exactly what I want to do.
@high_flyer: I now about polymorphism, I thing you didnt understand my question
@ DanH: I will explain better, I have a QList of pointers to a base class:
class Baseclass
{
virtual void draw(){};
virtual QString type
() const{return "base";
} }
class Entity_Lines : public Baseclass
{
void draw();
QString type
() const{return "Line";
} }
class Entity_PolyLines : public Baseclass
{
void draw();
QString type
() const{return "polyline";
} }
QList<Baseclass *> m_listEntities;
class Baseclass
{
virtual void draw(){};
virtual QString type() const{return "base";}
}
class Entity_Lines : public Baseclass
{
void draw();
QString type() const{return "Line";}
}
class Entity_PolyLines : public Baseclass
{
void draw();
QString type() const{return "polyline";}
}
QList<Baseclass *> m_listEntities;
To copy to clipboard, switch view to plain text mode
That list will be filled with lines and polylines from derived classes.
At run time I want to copy some given elements from m_listEntities and append them to m_listEntities (this is when the user creates new lines/polylines from existent selected ones)
I solved my problem, it's working with the following code:
for(int i=0;i<m_listEntities_selected.size();i++)
{
if ( m_listEntities.at(m_listEntities_selected.at(i))->type() == "Line" )
{
Entity_Lines *entity = new Entity_Lines;
*entity = *dynamic_cast<Entity_Lines*> (m_listEntities.at(m_listEntities_selected.at(i)) );
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
else if ( m_listEntities.at(m_listEntities_selected.at(i))->type() == "polyline" )
{
Entity_PolyLines *entity = new Entity_PolyLines;
*entity = *dynamic_cast<Entity_PolyLines*> (m_listEntities.at(m_listEntities_selected.at(i)) );
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
}
for(int i=0;i<m_listEntities_selected.size();i++)
{
if ( m_listEntities.at(m_listEntities_selected.at(i))->type() == "Line" )
{
Entity_Lines *entity = new Entity_Lines;
*entity = *dynamic_cast<Entity_Lines*> (m_listEntities.at(m_listEntities_selected.at(i)) );
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
else if ( m_listEntities.at(m_listEntities_selected.at(i))->type() == "polyline" )
{
Entity_PolyLines *entity = new Entity_PolyLines;
*entity = *dynamic_cast<Entity_PolyLines*> (m_listEntities.at(m_listEntities_selected.at(i)) );
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
}
To copy to clipboard, switch view to plain text mode
But is not that elegant since I will have to keep adding new "if else" for every new derived class entities (circles, squares, whatever...)
I was trying a better generic solution like this
for(int i=0;i<m_listEntities_selected.size();i++)
{
Baseclass *entity = new Baseclass;
*entity = *dynamic_cast<(typeid(m_listEntities.at(m_listEntities_selected[i]) ) )> (m_listEntities.at(m_listEntities_selected.at(i)));//errors
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
for(int i=0;i<m_listEntities_selected.size();i++)
{
Baseclass *entity = new Baseclass;
*entity = *dynamic_cast<(typeid(m_listEntities.at(m_listEntities_selected[i]) ) )> (m_listEntities.at(m_listEntities_selected.at(i)));//errors
entity->newPosition(point3d-point_base_copy);
m_listEntities.append(entity);
}
To copy to clipboard, switch view to plain text mode
Basically I'm trying to do a cast at run time, using typeid to grab the object type, but I get 2 errors:
error: expected type-specifier before ‘(’ token
error: expected ‘>’ before ‘(’ token
error: expected type-specifier before ‘(’ token
error: expected ‘>’ before ‘(’ token
To copy to clipboard, switch view to plain text mode
Bookmarks