2010-09-22 5 views
1

J'écris un serveur en C++ et crée une classe appelée client pour stocker des informations sur les clients connectés. Je voulais stocker les clients dans un vecteur. J'ai un appelComment ajouter une 'nouvelle' classe à un vecteur

clients.push_back(new client(addr,fd)); 

pour ajouter un objet client aux clients vectoriels. Je reçois l'erreur suivante sur la compilation

server.cpp:67: error: no matching function for call to ‘std::vector<client, std::allocator<client> >::push_back(client*) 

Je pense qu'il a quelque chose à voir avec mon incompréhension du mot-clé new et la façon dont les données sont stockées/déplacé en C++. Je viens d'un arrière-plan Java, donc je ne suis pas habitué aux pointeurs et aux memmorys de C++.

+0

Il n'y a rien de mal à cela, à quoi ressemble la ligne où vous déclarez votre vecteur 'clients'? –

+7

Vous avez [un bon livre d'introduction C++,] (http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list)? Sinon, vous avez vraiment besoin d'en avoir un et de le lire. Je devine de votre message que vous ne comprenez probablement pas les bases de la gestion de la mémoire en C++, et c'est un domaine qui est plein de pièges communs. –

+1

Probablement votre vecteur n'est pas déclaré comme «vecteur » mais comme «vecteur » –

Répondre

4

Vous presque certainement envie juste pour se débarrasser de l'new il est donc:

clients.push_back(client(addr, fd)); 

En Java vous devez explicitement new tous vos objets, mais en C++ non seulement vous n'avez pas besoin, mais vous voulez généralement l'éviter quand/si raisonnable.

+0

Je pense que vous faussez. 'new' n'est pas" optionnel ", mais c'est une chose complètement différente de déclarer une instance automatique. Ils ne sont généralement pas interchangeables. (Dans ce cas, cependant, à moins que la déclaration apparemment défectueuse du vecteur ne soit modifiée, 'new' ne devrait pas être utilisé (avec un' '' ajouté pour passer la vérification syntaxique) car cela produirait une fuite, et parce qu'il en résulte en travail supplémentaire inutile.) –

+0

@Daniel: Relisez la question. Pour ce que le PO a demandé, Jerry a certainement donné la bonne réponse. Cela ne signifie certainement pas que «nouveau» est mauvais en général, mais il n'a pas dit cela. Ce dont l'OP a besoin, c'est [un bon livre C++] (http: // stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). Et plutôt d'urgence. – sbi

4

Comment avez-vous créé votre vecteur?

Vous devez transmettre un paramètre de modèle de Client* afin que vous ayez std::vector<Client*> clients; si vous souhaitez stocker des pointeurs à l'intérieur. Si vous utilisez cette méthode et que vous utilisez des pointeurs bruts qui pointent vers la mémoire sur le tas (comme créé avec new), souvenez-vous que vous devrez éventuellement parcourir chaque élément de votre vecteur et appeler delete sur chaque élément.

Ou si cela ne vous dérange pas vos objets de clients copiés, vous pouvez utiliser std::vector<Client> clients; puis appelez clients.push_back(myClient);

0

En supposant que vous pouvez utiliser la bibliothèque Boost, vous pourriez aussi envisager quelque chose comme (non testé):

typedef ClientSharedPtr boost::shared_ptr<Client>; 
std::vector<ClientSharedPtr > clients; 
ClientSharedPtr client(new Client()); 
clients.push_back(client); 

De cette façon, vous obtiendrez des pointeurs vers client géré automatiquement.

Vous pouvez également envisager de fournir un constructeur de copie sur le client puis:

std::vector<Client> clients; 
Client client; 
clients.push_back(client); 

Une copie du client alors se produire quand il est poussé sur le vecteur.

+0

Les déclarations de 'clients' dans vos deux exemples sont en train de déclarer localement des fonctions retournant un' std :: vector'. Vous devez supprimer les parenthèses pour que le code fonctionne. – dreamlax

+0

Oups - mon boo boo. Corrigée. Merci. –

Questions connexes