Domanda

È seguente codice C ++ legale o no?

class Foo
{
  class Bar;

  void HaveADrink(Bar &bar);
  void PayForDrinks(Bar &bar);

  public:
  void VisitABar(int drinks);
};

class Foo::Bar
{
  public:
  int countDrinks;
};

void Foo::HaveADrink(Bar &bar)
{
  bar.countDrinks++;
}
void Foo::PayForDrinks(Bar &bar)
{
  bar.countDrinks = 0;
}
void Foo::VisitABar(int drinks)
{
  Bar bar;
  for (int i=0; i<drinks; i++) HaveADrink(bar);
  PayForDrinks(bar);
}

Sia Visual C ++ e GCC accetta, ma il codice sembra un po 'strano per me e mi odierebbe di averlo rifiutato da qualche futuro compilatore.

Ancora, il modello sembra utile per me per ridurre le dipendenze in fase di compilazione - Io uso spesso per dichiarare le strutture che vengono utilizzati per passare un po 'di "contesto" (un gruppo di variabili) che sono condivisi tra un paio di funzioni che risiedono tutti in lo stesso file cpp, e in questo modo io non devono introdurre la definizione di "contesto" in l'interfaccia pubblica.

È stato utile?

Soluzione

legale, e in effetti utile per nascondere i dettagli di implementazione con il mondo esterno.

Altri suggerimenti

[modifica] Originariamente ho detto che questo era il "linguaggio Pimpl": http://c2.com/cgi/wiki?PimplIdiom ma sono d'accordo che questo è solo una parte di Pimpl è circa. Questa tecnica viene utilizzata da Pimpl.

Sei "forwarding" classe Bar all'interno della classe Foo. Perfettamente legale finché non si fa nulla all'interno della definigino di Foo che richiederebbe il sizeof Bar. È possibile fare riferimento Bar utilizzando il puntatore o riferimento (Bar * o Bar &), ma se si dichiara un membro di dati in Foo come questa:

privato:     Bar _bar;

Non funzionerebbe. La ragione è che la definizione di Foo deve essere sufficiente per determinare la sizeof Foo. Dal momento che la dimensione di Bar è sconosciuta all'interno della definizione di Foo, sarebbe rendere la dimensione del Foo indeterminato. Ma usando un puntatore avrebbe funzionato:

privato:     Bar * _bar;

Perché il sizeof del puntatore è la stessa, e quindi conosciuta, indipendentemente da come Bar sarà successivamente definito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top