2009-10-09 8 views
8

J'écris une classe C++ pour lire l'entrée d'un fichier dans des tampons préalloués appelés "morceaux".C++: comment une fonction membre statique publique peut-elle accéder à des variables de membre d'instance privée?

Je veux l'appelant pour être en mesure d'appeler une méthode de classe Chunk public static appelée GetNextFilledChunk(), qui

  1. Grabs un gros morceau d'un pool de morceau inactif
  2. Remplit l'instance de Chunk de la flux d'entrée en utilisant les variables/fonctions membres privées de Chunk
  3. Renvoie un pointeur sur le morceau à l'appelant

Mais l'étape 2 me donne des crises. Peu importe ce que j'ai essayé, essayer d'accéder aux variables/fonctions des membres privés de l'occurrence de bloc entraîne l'émission d'erreurs par g ++ 4.2.1.

est ici un morceau de la définition de classe à partir du fichier d'en-tête:

class Chunk 
{ 
public: 
         Chunk(); 
... 
    static Chunk*  GetNextFilledChunk(); 
... 

private: 
... 
    ssize_t    m_ActualTextSize; 
}; 

Et voici une partie du fichier source qui montre le problème: Comme le montre

#include "Chunk.h" 


Chunk:: 
Chunk* GetNextFilledChunk() 
{ 
    ... 
    theChunk = sInactiveChunks.top(); 
    sInactiveChunks.pop(); 
    ... 
    theChunk->m_ActualTextSize = TextSize(); // PROBLEM IS HERE 
    ... 

    return theChunk; 
} 

, g ++ se plaint que GetNextFilledChunk () tente d'accéder à un membre privé de Chunk.

Ensuite, j'ai pensé, peut-être qu'il doit être un "ami". Mais tout ce que j'ai essayé de faire dans le fichier d'en-tête pour faire GetNextFilledChunk() un ami se traduit par une erreur. Par exemple:

friend static Chunk * GetNextFilledChunk();

résultats dans "Chunk.h: 23: avertissement: 'Chunk * GetNextFilledChunk()' a déclaré 'statique' mais jamais défini"

Ce que je trouve vraiment bizarre est que si je fais simplement GetNextFilledChunk() une plaine ancienne fonction, pas une fonction de membre statique, je peux "l'ami" et tout le monde est heureux. Mais cela semble stupide - pourquoi devrait-on être capable de faire quelque chose dans une classe à partir d'une fonction non-classe qui ne peut pas être effectuée à partir d'une fonction membre statique?

Alors ... Comment peut-accès aux fonctions GetNextFilledChunk() s de Chunk variables membres privées d'une instance de Chunk?

Et si elle ne peut se faire, est-il une partie inhérente de C++, ou tout simplement un bogue dans g ++?

+0

sauf pour raison de faute de frappe, je pense qu'il y a aussi un problème qu'une fonction membre statique n'est pas autorisée à visiter membre non statique. – DarkHorse

Répondre

21

Cela semble un peu bizarre:

Chunk:: 
Chunk* GetNextFilledChunk() 
{ 

Est-ce une faute de frappe? Devrait-il être:

Chunk* Chunk::GetNextFilledChunk() 
{ 

? Il semble que vous définissez accidentellement GetNextFilledChunk comme étant une fonction plutôt qu'un membre de Chunk.

+1

Parfois, les choses sont tellement simples :) –

+1

Duh! Cela l'a corrigé. Merci! –

+11

Nous avons tous été là – gatorfax

7

Vous définissez la mauvaise fonction de votre membre. Il doit être défini comme ceci:

Chunk * Chunk::GetNextFilledChunk() 
{ 
    ... 
} 

Que la définition est arrivé à compiler correctement était due à une bizarrerie de la langue: les noms de classe s'insérés dans leurs propres espaces de noms, donc Chunk::Chunk équivaut à Chunk, de sorte que vous définissiez une fonction globale par accident.

8

Le problème est dans votre définition de GetNextFilledChunk. Comme indiqué dans le fichier CPP, vous avez déclaré une fonction non-membre précédée d'une étiquette mal formée. Il ne sera pas aligné avec la fonction membre dans l'en-tête.

La signature est correcte comme suit

Chunk* 
Chunk::GetNextFilledChunk() { 
    ... 
} 
2

Tout d'abord, comme les autres l'ont mentionné, la définition de la fonction est erronée. De plus, une fonction friend n'est pas requise et les spécificateurs d'accès ne sont pas importants ici car vous avez l'intention que la fonction fasse partie de la classe et n'est évidemment pas prise par le compilateur à cause des fautes de frappe. Pour une réponse directe à votre question: Comment une fonction membre publique statique peut-elle accéder à des variables de membre d'instance privée?

Il ne peut pas; seules les fonctions membres non statiques peuvent accéder à la fois aux variables statiques et non statiques et les fonctions membres statiques ne peuvent accéder qu'aux variables membres statiques. Raison: Il n'y a pas d'instanciation d'objet requise pour appeler une fonction statique et donc ce pointeur à une fonction membre statique et, par conséquent, aucune variable membre statique à accéder.

+2

Pas si. Une fois que j'ai corrigé la faute de frappe comme suggéré, la fonction membre statique était capable d'accéder aux variables de membre privé des instances de bloc, tant qu'il avait un pointeur vers le bloc. –

+0

Toujours vous accédez aux variables non-statiques seulement via un objet (ref./ptr) et pas directement sans un pointeur. Essayez d'utiliser m_ActualTextSize directement à l'intérieur de la fonction membre statique, sans référence ni pointeur. Il ne compilera pas. – legends2k

+0

Eh bien, oui, je le savais. Le problème était vraiment la faute de frappe. –

0

Je pense que le modèle singleton s'adapte très bien pour cela. Vous pouvez accéder à n'importe quel type de fonctions membres sans vous soucier si vous y accédez à partir de fonctions statiques ou non ...

Questions connexes