J'essaie de créer un pointeur vide vers un objet de classe et de l'initialiser dans une fonction. Malheureusement, le membre du tableau de la classe ne peut pas échapper à la fonction, c'est-à-dire qu'il n'est pas accessible après l'initialisation.Pointeur vide vers un objet de classe: Initialisation dans une fonction
Dans le code ci-dessous, le premier appel à imprimer des positions (à l'intérieur de la fonction d'initialisation) fonctionne correctement, cependant, le deuxième appel à imprimer des positions de l'extérieur de la fonction d'initialisation échoue. J'ai le sentiment que l'objet tableau créé dans la fonction d'initialisation est détruit et non transmis mais je ne suis pas sûr et je ne sais pas non plus comment le réparer.
Toute aide serait grandement appréciée.
#include <iostream>
#include <iomanip>
#include <string>
class Atoms
{
double * positions;
int nAtoms;
public:
// Standard constructor prividing a pre-existant array
Atoms(int nAtoms, double * positionsArray)
{
this->nAtoms = nAtoms;
this->positions = positionsArray;
}
// Print positions to screen
void print_positions()
{
std::cout<< "nAtoms: " << this->nAtoms << std::endl;
int nDim = 3;
for (int i = 0; i < nAtoms; i++)
{
for (int j = 0; j < nDim; j++)
{
std::cout << std::setw(6) << this->positions[i * nDim + j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
};
void initialize_Atoms_void_pointer(void ** voidAtomsPointer)
{
//Create a new instance of Atoms by a pointer
int numAtoms = 5;
int numDim = 3;
int elemN = numAtoms * numDim;
double data_array[elemN];
for (int i = 0; i < numAtoms; i++)
for (int j = 0; j < numDim; j++)
{
data_array[i * numDim + j] = i * numDim + j + 10;
}
Atoms *atoms = new Atoms(numAtoms, data_array);
// Set the vPointer that the void pointer points to a pointer to Atoms object
*voidAtomsPointer = static_cast<void *>(atoms);
//Test call
std::cout << std::endl << "Initializing atoms" << std::endl;
static_cast<Atoms *>(*voidAtomsPointer)->print_positions();
}
void print_Atoms_pointer_positions(void * voidAtomsPointer)
{
//Cast the pointer as an atoms pointer
Atoms *atomsPointer = static_cast<Atoms *>(voidAtomsPointer);
atomsPointer->print_positions();
}
int main()
{
//Use the initializer function for getting a pointer
void *testVoidAtomsPointer;
initialize_Atoms_void_pointer(&testVoidAtomsPointer);
print_Atoms_pointer_positions(testVoidAtomsPointer);
}
En plus du tableau local qui est votre problème principal, un autre problème est que elemN n'est pas une expression de constante de temps de compilation, donc il est mal formé pour l'utiliser comme taille du tableau. C'est facile à corriger en ajoutant 'const'. – user2079303
'new',' void * '. Même C++ 98 a 'std :: vector', et C++ 11 introduit' std :: shared_ptr <> '. Ce code souffre vraiment parce qu'il réinvente la roue, mal. – MSalters
Merci pour cette suggestion. Malheureusement, dans ce problème, je suis quelque peu contraint d'utiliser les outils très basiques. –