2014-05-20 1 views
0

J'ai un projet utilisant la bibliothèque CImg. Ce que je dois faire est de déclarer des classes qui héritent d'une classe de base abstraite appelée shape. Ces classes sont des classes pour les différentes formes (cercle, rectangle .. etc). Ce que je veux faire est d'utiliser une classe struct appelée point pour les différents points dont j'ai besoin pour chaque classe. Ainsi, par exemple, pour une forme de triangle, je dois utiliser trois points pour dessiner un triangle avec chaque point ayant une coordonnée x et une coordonnée y. Alors, voici ce que j'ai obtenu jusqu'ici.C++ structure en tant que membre de données privé

class Shape 
{ 
public: 
    virtual void draw_shape() = 0; 
    virtual double area() = 0; 
}; 

struct Point 
{ 
    const int x; //const is necessary because CImg drawing functions require them. 
    const int y; 
}; 

class Triangle : public Shape 
{ 
private: 
    struct Point first; 
    struct Point second; 
    struct Point third; 
public: 
    Triangle(); 
    Triangle(const int, const int, const int, const int, const int, const int); 
    virtual void draw_shape(); 
    virtual double area(); 
}; 

1) Comment initialiser les coordonnées x et y de chaque structure?

Triangle::Triangle() : first.x(0), first.y(0), second.x(0), second.y(0), third.x(0), third.y(0) 

ne fonctionne pas

2) est mon constructeur surchargé correct ou devrais-je utiliser ce constructeur:

Triangle(Point, Point, Point); 

3) Comment puis-je utiliser les points après chaque fois que je veux dessiner quelque chose ?! 4) La structure est-elle avant d'instancier les Points nécessaires en C++?

+0

Ajouter un constructeur à la structure 'Point'? –

+0

Comment?! Je ne savais même pas que la structure pouvait avoir des constructeurs – Mustafa

+2

La seule différence entre une 'struct' et une' class' en C++, est la visibilité par défaut, pour 'struct' tout est' public' par défaut alors qu'il est 'private' par défaut pour 'class'. C'est tout, sinon ils sont égaux. –

Répondre

1

Vous pouvez appeler les constructeurs de vos points, comme ceci:

Triangle() : first{0, 0}, second{0, 0}, third{0, 0} {} 

Vous pouvez ajouter un constructeur explicite vous, si vous vouliez faire quelque chose d'un peu plus complexe:

struct Point 
{ 
    int x; 
    int y; 

    Point(int a, int b) : x(a), y(b) { /* ... */ } 
}; 
1

Considérant 1)

Vous pouvez simplement utiliser ceci:

Triangle::Triangle() : first{0,0}, second{0,0}, third{0,0} {} 

Considérant 2) Je pense que le constructeur

Triangle(Point, Point, Point); 

est mieux. Lorsque vous avez déjà des points, pourquoi ne pas les utiliser?

Considérant 3) dependons sur la façon dont les choses se tirer

Considérant 4) Non, il ne faut pas.

+0

Cool. Mais serai-je capable d'instancier les points en utilisant ints. Je ne veux pas avoir à instancier des structs Point chaque fois que je veux dessiner quelque chose – Mustafa

+1

@Mustafa - Il serait alors utile si vous avez ajouté à votre question. Ajouter une "API préférée" montrant comment vous aimeriez utiliser vos classes. – Dennis

+0

@Mustafa: Instancier un point n'est pas moins efficace que de simplement utiliser deux nombres. Pourquoi ne voulez-vous pas utiliser des points lorsque vous dessinez quelque chose? – gexicide

Questions connexes