2010-11-23 23 views
0

J'ai une variable, qui est membre d'une de mes classes, dont une autre a besoin, mais je ne suis pas sûr de savoir comment pour passer efficacement la valeur entre eux sans utiliser une variable globale, ce que je voudrais éviter si possible. Je sais que je pourrais créer un objet, mais cela invoquerait le constructeur de la classe d'origine qui exécuterait un certain nombre de fonctions et écrirait les résultats inutiles à la mémoire, ce qui serait un gaspillage de ressources système.Est-il possible de passer une variable hors d'une classe sans créer un nouvel objet en C++?

Existe-t-il un moyen facile de transmettre cette valeur entre les deux fonctions?


Mise à jour: La classe qui est dans le besoin de la variable, appelée no_of_existing_devices. Le but de class Initialise est d'ouvrir un fichier et compter le nombre de lignes de test, il contient, et placez ce nombre dans la int no_of_existing_devices variable, qui est ensuite utilisé par le Device::Device() pour créer un objet pour chaque

class Device 
{ 
public: 
    void view_attribute_list(); 
    void set_attribute(); 
    Device(); 
}; 

Device::Device() 
{ 
    for (int count = 0; count < no_of_existing_devices; count ++) 
    { 
    // Create an object for each iteration, up to a maximum of no_of_existing_devices 
    } 
} 

la classe dont cette variable est membre

class Initialise 
{ 
public: 
    int no_of_existing_devices; 
    bool initialisation; 
    string existing_device_list[100]; 

    void initialise_existing_devices(); 
    Initialise(); 
}; 

Initialise::Initialise() 
{ 
    no_of_existing_devices = 0; 
} 

void Initialise::initialise_existing_devices() 
{ 
    string line; 
    ifstream DeviceList; 
    DeviceList.open("devices/device_list"); 
    while (true) 
    { 
     getline(DeviceList, line, '\n'); 
     if (DeviceList.eof()) 
     { 
      break; 
     } 
     ++ no_of_existing_devices; 
    } 
    DeviceList.close(); 

    DeviceList.open("devices/device_list"); 
    for (int i = 0; i < no_of_existing_devices; i ++) 
    { 
     getline(DeviceList, line, '\n'); 
     existing_device_list[i] = line; 
    } 

    Device existing_devices[no_of_existing_devices]; 
    !initialisation; // Existing devices are now initialised 
} 
+1

Est cette variable censée être un champ membre dont jamais la classe contient? Cela dépend-il de l'existence d'une instance ou peut-il exister seul? – birryree

+0

pouvez-vous poster votre code afin que nous puissions avoir plus de compréhension de ce que vous essayez d'accomplir? – pankajt

+0

Vous devrez poster plus de code afin que nous puissions comprendre ce que vous souhaitez réaliser. – Puppy

Répondre

1

D'accord, ce que je comprends:

  1. Vous ne voulez pas avoir un
  2. global
  3. Vous ne voulez pas avoir un
  4. statique Vous ne voulez pas d'introduire une dépendance entre Device et Initialise

Il y a une autre option, en supposant quelque chose possèdeDevice et Initialise, déplacez le no_of_existing_devices jusqu'à là, puis construire à la fois Device et Initialise avec une référence à cette variable ...

0

Si la variable de la classe d'origine peut contenir une valeur sans une instance de la classe, je suppose que la variable est statique. Si ce n'est pas le cas, créez un membre statique public de la classe. Et utilisez-le dans la classe cible. Quelque chose comme:

// .h file 

class A 
{ 
    public: 
     static int a; 
} 

// .cpp file 

int A::a = 123; 

// .cpp file of class B 

void B::foo() 
{ 
    cout << A::a; 
} 
-1

Si elle est un attribut de classe (variable interne), alors vous pouvez obtenir une référence par une méthode get. Dans le cas contraire, vous pouvez utiliser le mot-clé friend sur la classe que vous voulez accéder au attribtue de l'autre, par exemple, si vous déclarez friend class B; la classe A, les attributs de la classe B seront accessibles sur la classe A.

I vous suggérons d'utiliser la première méthode pour maintenir votre code OO pur;)

Edit: bien sûr, si vous accédez par une référence, il n'y a pas de ressources gaspillées :)

Edit 2: utilisation une méthode statique sur Initialise classe qui renvoie le no_of_existing_devices et appelez Initialise::NoOfExistingDevices() sur la classe Device. Si vous voulez utiliser les ressources d'un pointeur comme ceci:

public static int* Initialise::NoOfExistingDevices() { 
    return &no_of_existing_devices; 
} 

D'ailleurs, je vous conseille de tourner la private variable.