2009-02-13 9 views
2

J'ai une liste std :: de points (qui stockent simplement un x, y). Chacun de ces points représente un polygone, que je dessine plus tard.Est-il possible (ou ok) d'avoir une liste std :: list de std :: list?

class Point { 
public: 
    int x, y; 
    Point(int x1, int y1) 
    { 
     x = x1; 
     y = y1; 
    } 
}; 

std::list <Point> currentPolygon; 

Je voudrais avoir une liste de ces polygones (listes eux-mêmes).

Est-ce possible? Comment ai-je une liste std :: list d'une liste de points (donc je peux stocker plus d'un polygone).

Répondre

9

Vous pouvez utiliser ceci:

std::list< std::list<Point> > polygons; 

Pour faciliter les choses, l'utilisation typedefs.

class Point { 
public: 
    int x, y; 
    Point(int x1, int y1) 
    { 
     x = x1; 
     y = y1; 
    } 
}; 
typedef std::list<Point> PolygonType; 
typedef std::list<PolygonType> PolygonsType; 
+0

ne pas oublier l'espace entre > et> dans std :: list >, ou l'analyseur penserait que vous voulez faire un bon décalage et vous plaindre. – Calyth

10

C'est sûr. Mais ce que vous voulez probablement - à des fins d'extensibilité plus tard - créer une deuxième classe - "polygone", qui contient une liste de points. Ensuite, utilisez une liste de polygones.

EDIT: Je ne suis pas programmeur C++, donc je suis sûr qu'une implémentation comme j_random_hacker's est meilleure si vous en avez besoin pour un vrai projet. Je voulais simplement donner un exemple de code quickie de cette conception.

class Point { 
public: 
    int x, y; 
    Point(int x1, int y1) 
    { 
     x = x1; 
     y = y1; 
    } 
}; 

class Polygon { 
public: 
    std::list <Point> currentPolygon; 
    Polygon(std::list <Point> p1) 
    { 
     currentPolygon = p1 
    } 
}; 
+0

std: liste surcharge l'opérateur d'assignation donc oui cela fonctionnera. –

+0

Doux ... Je vis trop longtemps dans le monde des arrailistes et des hashtables .net. – Jeffrey

+0

Fondamentalement OK mais je vous suis puisque vous employez plusieurs mauvaises habitudes: (1) Vous devriez déclarer votre Polygon ctor "explicite" pour éviter les conversions implicites de la liste ; (2) passer p1 par const ref au ctor; (3) Les utilisateurs de points et de polygones doivent tous les deux initialiser les membres en utilisant une liste d'initialisation. –

4

est ici le code de Jeffrey nouveau, tondu légèrement pour corriger ce que je geindre au sujet dans les commentaires :)

class Point { 
public: 
    int x, y; 
    Point(int x1, int y1) : x(x1), y(y1) 
    { 
    } 
}; 

class Polygon { 
public: 
    std::list <Point> currentPolygon; // Consider making this private. 
    explicit Polygon(std::list <Point> const& p1) : currentPolygon(p1) 
    { 
    } 
}; 

[EDIT: Merci à Matt Davis de remarquer que le user- le constructeur de copie défini que j'ai fourni était inutile, ce qui simplifie les choses.]

+0

Sauf si je ne me souviens pas correctement du "C++ efficace" de Scott Meyers, le compilateur fournit également le constructeur de copie. –

+0

@Matt Davis: Vous avez raison, j'ai maintenant résolu cela. (Pour une raison quelconque, je pensais que peut-être désactiver la génération automatique des copieurs en fournissant un ctor à un paramètre de votre choix, mais bien sûr ce paramètre doit être une référence (éventuellement const et/ou volatile) à la classe propre type.) –

Questions connexes