Доступ к инициализированной переменной в другом классе C ++ - PullRequest
0 голосов
/ 19 мая 2010

У меня проблемы с этой проблемой.

Основная идея состоит в том, что я инициализировал переменную типа B в классе A, в классе A.h переменная Z объявлена ​​как public, как B * Z;

В классе A.cpp я инициализировал его как Z = new B ();

Теперь я хочу получить доступ к этой переменной из класса C и не могу этого сделать. C.h включает A.h и B.h

Вот немного кода:

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();
}

Ответы [ 5 ]

2 голосов
/ 19 мая 2010

Я инициализировал переменную типа класса B в классе 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
   }
}

Это должно работать! Будьте осторожны, чтобы включить #pragma once или защиту заголовка / включить защиту (http://en.wikipedia.org/wiki/Header_file), чтобы заголовки не были включены дважды (если бы это было сделано).

Есть 3 класса, автомобиль, модель и камера. в машине объявляю новую модель Z и я хочу, чтобы камера следила за этим модель, поэтому мне придется получить доступ к модели позиции в классе камеры

  • A = Автомобиль
  • B = Модель
  • C = Камера
1 голос
/ 19 мая 2010

На основании обновленного вопроса:

Ваша проблема в том, что вы нигде не определили переменную Car::Z. У вас есть объявление для него в классе Car, но нигде нет определения.

Вам нужно добавить в файл car.cpp строку:

Model* Car::Z;

Или, при желании, если вы хотите дать Z начальное значение, что-то вроде:

Model* Car::Z = NULL;

В общем, это необходимо для статических переменных-членов, которые являются чем угодно, кроме константных целых чисел. Вам нужно объявление в блоке class { }, а затем вам также нужно определение в соответствующем файле .cpp, в противном случае вы получите эту ошибку.

1 голос
/ 19 мая 2010

Итак, у вас есть

class A {  
public:  
    B* Z;  
};  

class B {  
public:  
    // Empty  
};  

class C {  
public:  
    // Empty  
};

Так сказать ... нет причин, по которым вы ДОЛЖНЫ иметь доступ к Z. Ваш вопрос не достаточно точен, чтобы сказать ... но вы должны это сделать

class C {
public: 
    A* z_access;
};

Теперь вы можете использовать «a» Z в классе C, используя класс A. Но нам нужно больше информации, чтобы увидеть, что на самом деле происходит.

1 голос
/ 19 мая 2010

Вы делаете что-то подобное?

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 голос
/ 19 мая 2010

Это статическая переменная? Если нет, вы должны получить к нему доступ из экземпляра класса A.

Из того, что вы написали, звучит, как будто это статично. В этом случае в A.h вы должны сказать

static B *Z;

Тогда в A.cpp вы должны определить это:

B *A::Z;

Тогда в C.cpp вы можете получить к нему доступ как

A::Z->whatever();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...