2017-04-09 4 views
0

Comment passer les deux paramètres de la classe à l'objet que je crée avec un pointeur? Quelle est la syntaxe? (Ils doivent recevoir tous les mêmes paramètres)tableau d'objets avec plusieurs paramètres utilisant un pointeur

Dans une situation normale, j'utilise ceci:

MyClass obj[5]={MyClass(x,y)} 

Mais ... dans ce cas, quelle est la syntaxe? :

MyClass *obj; 
obj = new MyClass[5]; //Here! <---- 

Comment puis-je transmettre les deux paramètres?

+1

Pourquoi pensez-vous que vous avez besoin de créer le tableau en utilisant 'new'? –

+0

@NeilButterworth C'est parce que dans le code j'ai besoin de générer * obj dans un fichier et affecter l'objet par la suite. Il y a d'autres façons de le faire? – nostyn

+1

Votre "situation normale" ne fait pas ce que vous pensez qu'elle est en train de faire. Seul l'élément * premier * tableau sera 'MyClass (x, y)'. –

Répondre

0

Il n'y a pas de syntaxe pour initialiser la liste d'un tableau alloué dynamiquement.

Vous devez

  • Soit 1) par défaut construire comme dans l'exemple que vous présentez, et modifier les objets après la création.
  • Ou 2) allouer un tableau de caractères de taille suffisante et construire les objets avec placement-new.

1) n'est pas une option si la classe n'est pas constructible par défaut. 2) est un peu compliqué, mais vous n'avez pas à le faire vous-même puisque std::vector l'a déjà implémenté pour vous. Vous devriez utiliser un vecteur de toute façon puisqu'il prend en charge la gestion de la mémoire.

Un exemple avec un vecteur, qui est analogue à votre "situation normale". Notez que votre « situation normale » ne correspond pas à la description dans votre question:

std::vector<MyClass> v{ 
    {x1, y1}, 
    {x2, y2}, 
    ... 
}; 

Un exemple avec le vecteur, qui correspond à votre description de passer même argument à tous les objets du tableau.Bien que techniquement, cette copie-construit les éléments du tableau:

std::vector<MyClass> v(5, {x, y}); 
+0

Lorsque j'utilise v (5, {x, y}) dans une liste d'initialisation, j'obtiens cet avertissement : liste d'initialisation étendue disponible uniquement avec -std = C++ 11 ou -std = gnu ++ 11 Ça pourrait me causer des problèmes à l'avenir? Il existe une syntaxe différente pour une liste d'initialisation? – nostyn

+0

@nostyn 'Cela pourrait me causer des problèmes à l'avenir? 'Non. Mais cela pourrait vous causer des problèmes dans le passé. Vous pouvez utiliser l'initialisation directe pré-C++ 11 si nécessaire. – user2079303

+0

Ce n'est pas un problème. Je ne voudrais pas aller hors-sujet mais: Si utiliser le vecteur j'utilise: "vector obj (taille);" || Et avec la liste d'initialisation: "vector obj;" puis ": obj (taille)" || Si vous voulez entrer ": obj (taille)" en dehors de la liste des initialiseurs, quelle est la syntaxe? (Par exemple, pour créer dans une fonction séparée) – nostyn

0

Je suppose que votre question est: "comment initialiser tous les objets dans un tableau avec exactement le même appel de constructeur?"

Si tel est le cas, la meilleure façon de le faire est à l'aide std::vector's constructor (2):

 vector(size_type count, 
      const T& value, 
      const Allocator& alloc = Allocator()); 

Constructs le récipient avec count copies d'éléments à valeur value.

Votre exemple devient alors:

std::vector<MyClass> obj(5, MyClass{x, y}); 

Si vous voulez vraiment utiliser un tableau de style C, vous devrez appeler manuellement les constructeurs utilisant placement new et invoquer manuellement destructeurs si vous voulez éviter inutile constructeur par défaut appels. Exemple:

std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> obj[5]; 
for(auto& x : obj) { new(&x) MyClass{x, y}; } 

// ... use `obj` ... 

for(auto& x : obj) { reinterpret_cast<MyClass*>(&x)->~MyClass(); } 

Notez que le code ci-dessus peut être (et devrait être) refactorisé en une abstraction sûre.

+0

Et vouloir assigner deux paramètres différents pour chaque objet dans le vecteur? – nostyn

+0

@nostyn: vous devez les épeler un par un. 'std :: vector :: vector (initialier_list)' vous permet de le faire facilement. –

+0

Okay! Grazie mille :) – nostyn