Comment créer un objet à l'intérieur d'une autre classe avec un constructeur?
Alors que je travaillais sur mon code, qui est conçu de façon modulaire. Maintenant, une de mes classes, que l'on appelle Splash
a pour créer un objet d'une autre classe qui est appelée Emitter
. Normalement vous devez juste créer l'objet et être fait avec elle, mais qui ne fonctionne pas ici, comme le Emitter
classe a un constructeur personnalisé. Mais lorsque j'essaye de créer un objet, il ne fonctionne pas.
Comme un exemple;
Emitter
a un constructeur comme suit: Emitter::Emitter(int x, int y, int amount);
et doit être créé de sorte qu'il peut être consulté dans le Splash
classe.
J'ai essayé de le faire, mais il ne fonctionne pas:
class Splash{
private:
Emitter ps(100, 200, 400, "firstimage.png", "secondimage.png"); //Try to create object, doesn't work.
public:
//Other splash class functions.
}
J'ai essayé aussi ce qui ne fonctionne pas non plus:
class Splash{
private:
Emitter ps; //Try to create object, doesn't work.
public:
Splash() : ps(100, 200, 400, "firstimage.png", "secondimage.png")
{};
}
Edit: je sais que la deuxième façon est censé fonctionner, cependant il ne le fait pas. Si je supprime le Emitter
Section, le code fonctionne. mais quand je le fais la deuxième façon, aucune fenêtre ne s'ouvre, aucune application n'est pas exécutée.
Alors, comment puis-je créer mon Emitter
objet pour une utilisation dans Splash
?
Edit:
Voici mon code pour l'émetteur de la classe et de l'en-tête:
Header
//Particle engine for the project
#ifndef _PARTICLE_H_
#define _PARTICLE_H_
#include <vector>
#include <string>
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "image.h"
extern SDL_Surface* gameScreen;
class Particle{
private: //Particle settings
int x, y;
int lifetime;
private: //Particle surface that shall be applied
SDL_Surface* particleScreen;
public: //Constructor and destructor
Particle(int xA, int yA, string particleSprite);
~Particle(){};
public: //Various functions
void show();
bool isDead();
};
class Emitter{
private: //Emitter settings
int x, y;
int xVel, yVel;
private: //The particles for a dot
vector<Particle> particles;
SDL_Surface* emitterScreen;
string particleImg;
public: //Constructor and destructor
Emitter(int amount, int x, int y, string particleImage, string emitterImage);
~Emitter();
public: //Helper functions
void move();
void show();
void showParticles();
};
#endif
et voici l'émetteur fonctions:
#include "particle.h"
//The particle class stuff
Particle::Particle(int xA, int yA, string particleSprite){
//Draw the particle in a random location about the emitter within 25 pixels
x = xA - 5 + (rand() % 25);
y = yA - 5 + (rand() % 25);
lifetime = rand() % 6;
particleScreen = Image::loadImage(particleSprite);
}
void Particle::show(){
//Apply surface and age particle
Image::applySurface(x, y, particleScreen, gameScreen);
++lifetime;
}
bool Particle::isDead(){
if(lifetime > 11)
return true;
return false;
}
//The emitter class stuff
Emitter::Emitter(int amount, int x, int y, string particleImage, string emitterImage){
//Seed the time for random emitter
srand(SDL_GetTicks());
//Set up the variables and create the particles
x = y = xVel = yVel = 0;
particles.resize(amount, Particle(x, y, particleImage));
emitterScreen = Image::loadImage(emitterImage);
particleImg = particleImage;
}
Emitter::~Emitter(){
particles.clear();
}
void Emitter::move(){
}
void Emitter::show(){
//Show the dot image.
Image::applySurface(x, y, emitterScreen, gameScreen);
}
void Emitter::showParticles(){
//Go through all the particles
for(vector<Particle>::size_type i = 0; i != particles.size(); i++){
if(particles[i].isDead() == true){
particles.erase(particles.begin() + i);
particles.insert(particles.begin() + i, Particle(x, y, particleImg));
}
}
//And show all the particles
for(vector<Particle>::size_type i = 0; i != particles.size(); i++){
particles[i].show();
}
}
Est également ici la Splash Classe et la Splash-Tête.
Comment s'est déroulée la dernière approche de l'échec? Semble tout à fait bien.
mis à jour pour refléter.
le point-virgule manquant à la fin de la classe Splash déclaration?
oh, c'est là. désolé.
OriginalL'auteur Rivasa | 2012-08-07
Vous devez vous connecter pour publier un commentaire.
La deuxième option devrait fonctionner, et je voudrais commencer à chercher à des erreurs de compilation pour voir pourquoi ça ne marche pas. En fait, merci de poster toutes les erreurs de compilation que vous avez concernant le présent code.
En attendant, vous pouvez faire quelque chose comme ceci:
pourriez-vous élaborer sur les raisons de cette aiderait?
Il doit compiler, de travailler et de faire ce dont il a besoin. Cependant, je pense qu'il ne fonctionne toujours pas, parce que le problème avec son code n'est pas avec le code, il a posté, mais avec quelque chose d'autre, soit dans l'Émetteur de la classe. De toute façon, cela permet de révéler le problème.
Hmm, je vais poster l'émetteur de la classe.
Suivant les conseils de l'aide d'un pointeur peut introduire d'autres problèmes au lieu de fixer les choses. En particulier, le code, viole la règle de trois. I. e., il ne impie choses si toute instance de
Splash
est jamais copié.OriginalL'auteur Jonathan Henson
Bien, j'ai réussi à le résoudre, dans un hackish manière. Ce que j'ai fait était de créer un constructeur par défaut, et de déplacer mon code Constructeur dans une nouvelle fonction. Ensuite, j'ai créé l'objet et appelé la nouvelle fonction init de mettre tout en place.
Le constructeur par copie n'est pas nécessaire pour ma splash de classe, seulement 1 est faite au début du programme, puis détruits. Aussi destructeur pour le splash de classe est juste celui par défaut.
1) Si il n'est pas nécessaire, supprimer (C++11) ou de déclarer, mais ne pas le définir (C++03). 2) Ok, mais ne jamais écrire un destructeur, sauf si vous avez l'intention d'ajouter un comportement personnalisé, laisser le compilateur faire.
Oh, d'accord, merci de me le faire savoir.
Vous pourriez tout aussi bien faire le constructeur de copie et l'opérateur d'affectation privé et de lui donner une définition vide. De cette façon, toute personne utilisant la classe recevrez une erreur de compilation lors de la tentative de faire une copie ou de la cession.
OriginalL'auteur Rivasa