-11
votes

Quand est-ce que la déclaration de terme ne suffit-elle pas?

Le problème #include

class widget { };

class fubar : public widget { // 1

    void value_parameter(widget); // 2    
    void ref_parameter(widget &); // 3
    void ptr_parameter(widget *); // 4

    virtual void value_parameter(widget); // 5
    virtual void ref_parameter(widget &); // 6
    virtual void ptr_parameter(widget *); // 7

    widget value_return(); // 8
    widget & ref_return(); // 9
    widget * ptr_return(); // 10

    widget instance_value_member; // 11
    widget & instance_ref_member; // 12
    widget * instance_ptr_member; // 13

    static widget static_value_member; // 14
    static widget & static_ref_member; // 15
    static widget * static_ptr_member; // 16
};


5 commentaires

Quelles lignes pensez-vous que c'est et pourquoi?


Le code implique widget est fourni juste avant FUBAR , mais le reste du texte de la question implique le contraire. Si c'est le premier cas, vous n'avez pas besoin du #include pour l'un des membres ( widget est déjà fourni). Si c'est la seconde, juste le fait que vous héritez de widget signifie que vous avez besoin du #include quel que soit le reste de la définition FUBAR .


@Sergio Legaz Ruiz Vous avez oublié de marquer cette classe de ligne FUBAR: widget public {.. :)


Bienvenue à Stackoverflow! Veuillez choisir un titre plus descriptif; Le titre est peu susceptible d'aider un futur visiteur.


.... pour le mettre gentiment


3 Réponses :


3
votes

aucun.

widget de classe {}; définit un type complet .

Cela aurait été une question différente si vous avez écrit widget de classe; i.e. a déclaration de classe avant . Ensuite, étant donné que vous auriez besoin d'un type en raison de l'héritage, il n'y aurait plus #include nécessaire pour les fonctions.


2 commentaires

Je soupçonne que c'était purement exposé, même si je concède que la question n'était pas bien encadrée.


@LightnessRacsinorbit: Vous devez répondre à ce qui est demandé. Methinks "Cela aurait été une question différente" montre une initiative suffisante de ma part ;-)



5
votes

Définition complète de widget est requis pour:

  • # 1 ( Classe FUBAR: widget public ), nous avons besoin de définition de la classe de base.
  • # 11 ( instance widget_value_member; ), nous avons besoin de définition de membre.

    Les déclarations avant sont suffisantes pour les autres.


4 commentaires

Qu'en est-il de # 8? # 14?


@LightnessRacesinorbit C'est une déclaration non une définition. :) Cela peut avoir un type incomplet.


Sainte SH! T TIL


@LighessRacksinorbit Yup, cela m'a surpris trop récemment. Il semble qu'une définition complète ne soit nécessaire que lorsqu'elle affecte la taille d'une instance de la classe. J'imagine que tout le reste reste à la liaison.



1
votes

Je pense que vous voulez dire une déclaration avant xxx pré>

au lieu de la définition p> xxx pré>

dans ce cas la première ligne d'en-tête de la classe Déclaration P>

void value_parameter(widget); // 2    
void ref_parameter(widget &); // 3
void ptr_parameter(widget *); // 4

virtual void value_parameter(widget); // 5
virtual void ref_parameter(widget &); // 6
virtual void ptr_parameter(widget *); // 7


2 commentaires

@ Jarod42 En général, le compilateur ne peut pas sélectionner une fonction selon laquelle son paramètre est une référence ou non.


@ Jarod42 oh, je n'ai pas vu ça. :)