2010-05-18 14 views
-1

Je rencontre des difficultés avec ce problème.Accès à la variable initialisée sur une autre classe C++

L'idée principale est, j'ai initialisé une variable de classe de type B dans la classe A, classe A.h a la variable Z déclarée comme publique, comme B * Z;

Dans la classe A.cpp, je l'ai initialisé comme Z = new B();

Maintenant, je veux accéder à cette variable de la classe C et je suis incapable de le faire. Ch comprend Ah et Bh

va ici un peu de code:

Car.h

#include "Model.h" 

class Car { 
public: 

    static Model *Z; 

} 

Car.cpp

#include "Car.h" 

void Car::init() { 
    Z = new Model(); 
} 

Model.h

Class Model {} 

Camera.h

#include "Model.h" 
#include "Car.h" 

class Camera {} 

Camera.cpp

Camera::init() { 
    Car::Z->getPos(); 
} 
+8

Je ne sais pas exactement quel problème vous avez. Pouvez-vous poster du code réel qui ne fonctionne pas? –

+1

Que voulez-vous dire par ne pas être en mesure d'y accéder. Avez-vous un message d'erreur? –

+0

Je suis avec Michael ... difficile de dire ce qui se passe sans le code. Vous voudrez peut-être rafraîchir les règles de portée c/C++. – Doug

Répondre

2

I initialized a variable of class type B in class A

#pragma once 
#include "B.h" 

class A 
{ 
    public: 

    B* Z; 
    A() 
    { 
     Z = new B(); 
    } 
} 

B.h

#pragma once 
class B 
{ 
} 

C.h

#pragma once 
#include "A.h" 

class C 
{ 
    A a; //here you construct A 
    C() 
    { 
     a.Z = new B(); //you can read/write Z 
    } 
} 

Cela devrait fonctionner! Veillez à inclure le #pragma once ou un garde d'en-tête/garde incluse (http://en.wikipedia.org/wiki/Header_file) afin que les en-têtes ne soient pas inclus deux fois (si cela aurait dû être fait).

There are 3 classes, car, model and camera. in car I declare a new model Z and I want the camera to follow that model so I'll have to access the model positions in camera class

  • A = Voiture
  • B = Modèle
  • C = Caméra
+0

#pragma une fois n'est pas vraiment standard, je crois qu'il n'est pas supporté par par exemple le compilateur intell C++ (ou il y a quelques versions). Inclure les gardes sont la façon standard de gérer l'inclusion multiple: http://en.wikipedia.org/wiki/Include_guard –

+0

Ainsi, ce ne sera pas comme lorsque C est construit, la mémoire de l'objet B sera allouée à l'intérieur d'un (Quand Constructeur de A est appelé) mais après cela, vous appelez le nouveau B dans le constructeur de C et le mettez à z, donc cela ne va-t-il pas conduire à une fuite de mémoire? – mawia

+0

@mawia: Oui ... mais ce n'est pas le but. Je voulais seulement montrer que vous pouvez accéder à Z. Et je ne voulais pas écrire une méthode de test ... :) – Simon

1

Est-ce une variable statique? Sinon, vous devez y accéder à partir d'une instance de classe A.

D'après ce que vous avez écrit, il semble que ce soit statique. Dans ce cas, Ah vous avez à dire

static B *Z; 

Puis, en A.cpp, vous devez définir:

B *A::Z; 

Puis, en C.cpp, vous pouvez y accéder comme

A::Z->whatever(); 
+0

J'ai essayé ceci et j'obtiens erreur quand j'essaye la 2ème étape il indique que B n'est pas un membre de A – d0pe

+0

FWIW, définissant ce serait B * A :: Z; – rotoglup

+0

oups, j'aurais dû essayer de le compiler avant de poster :). B * A :: Z; est certainement correct. – Chris

1

que tu fais quelque chose comme ça?

class A{ 
public: 
    A() : m_B(new B()); 
    B* getB() const { return m_B;} 
private: 
    B *m_B; 
}; 

class C{ 
public: 
    B* getB() const { return m_A.getB(); } 
private: 
    A m_A; 
}; 
1

Vous avez

class A { 
public: 
    B* Z; 
}; 

class B { 
public: 
    // Empty 
}; 

class C { 
public: 
    // Empty 
}; 

donc dire ... il n'y a aucune raison pourquoi vous devriez être en mesure d'accéder à Z. Votre question ist ne percice suffit pas de dire ... mais vous devriez ne

class C { 
public: 
    A* z_access; 
}; 

vous pouvez maintenant utiliser « un » Z en classe C en utilisant la classe A. Mais nous avons besoin de plus d'informations pour voir ce qui se passe réellement.

1

Sur la base de la question mise à jour:

Votre problème est que vous ne l'avez pas réellement défini nulle part la variable Car::Z. Vous avez une déclaration dans la classe Car, mais il n'y a aucune définition nulle part.

Qu'est-ce que vous avez besoin est d'ajouter, dans le fichier car.cpp, la ligne:

Model* Car::Z; 

Ou, le cas échéant, si vous voulez donner Z une valeur initiale, quelque chose comme:

Model* Car::Z = NULL; 

Cela est généralement nécessaire pour les variables de membre statiques qui ne sont pas des entiers constants. Vous avez besoin de la déclaration dans le bloc class { }, puis également besoin d'une définition dans le fichier .cpp correspondant, sinon vous obtiendrez cette erreur.

Questions connexes