Je travaille sur un projet et il est dans une étape que je ne sais pas ce qui ne va pas. Voici la version simplifiée:Polymorphisme et tableau de problème de pointeurs en C++
Le code:
class Base { // This base class is pure abstract
public:
virtual ~Base(); // Necessary to trigger destructors in inherited classes
virtual baseFunc() = 0;
};
class DerivedA : public Base{
public:
DerivedA(SomeClassUseBase * tmp){
tmp -> register(this);
}
~DerivedA();
void baseFunc(){
// do something here that's only for DerivedA
}
};
class DerivedB : public Base{
public:
DerivedB(SomeClassUseBase * tmp) {
tmp -> register(this);
}
~DeriveB();
void baseFunc(){
// do something here that's only for DerivedB
}
};
class SomeClassUseBase {
private:
Base ** basePrt;
unsigned int index;
public:
someClassUseBase(int num) {
basePrt = new Base*[num]; //create an array of pointers to the objects
index = 0;
}
void register(Base * base){
//i tried *(basePrt[index]) = *base, but got the same problem
basePrt[index] = base;
index = index + 1;
}
void checkList() {
for (int i = 0; i < index ;i++){
next = basePrt[i];
next -> baseFunc(); //fails here
}
}
};
int main() {
SomeClassUseBase tmp = new SomeClassUseBase(5);
Base *b[5];
for (i = 0; i < 5; i += 1) {
if (i % 2 == 0) {
b[i] = new DerivedA(&tmp);
}
else {
b[i] = new DerivedB(&tmp);
// the object pointed by tmp::basePrt[0] is lost after this line
} // if
} // for
tmp.checkList(); //crashes here since tmp.bastPrt[0] points to null
}
Le problème est que quand dans le principal, je tends la ligne lorsque la première DerivedB est créé, le pointeur DerivedA déjà créé par tmp.basePrt [0] est perdu un peu comment. Je ne sais pas pourquoi mais je soupçonne que cela a un rapport avec le polymorphisme? S'il vous plaît aider !! Merci!!
Edit:
N'a pas tout à fait obtenir le bon code la première fois, désolé ...
Juste pour ajouter quelques détails à la question: un objet de SomeClassUseBase gardera un tableau de ptr aux objets de la classe de base, qui sera l'exécution soit DerivedA ptr ou DerivedB ptr. La raison pour laquelle tmp.register appelle (this) est d'ajouter self à cette liste. Et btw, tmp a une fonction publique Base ** getTheList(); , qui retournera le tableau de pointeurs aux objets Base, à nouveau (ce seront des pointeurs vers DerivedA/B à l'exécution) – derrdji
Le code, tel que présenté, ne compile pas. Corriger les erreurs du compilateur et l'exécuter ne présente pas le problème que vous rencontrez. Peut-être devriez-vous vérifier que l'exemple que vous donnez démontre le problème que vous rencontrez.Je – Skizz