Как переменные могут использоваться набором классов? - PullRequest
0 голосов
/ 28 августа 2010

У меня есть вопрос, который я не могу понять, как довольно новый для c ++.У меня есть класс, в котором набор переменных объявляется в файле .h, а затем инициализируется в файле .cpp.Эти же переменные используются набором из 3 других классов - и компилятор выводит их из области видимости.Я не уверен, как связать классы, чтобы переменные были видны всем классам.Сам код является портом из языка Java.Я использую openFrameworks в качестве среды разработки, и я разместил там свои ошибки компилятора, если будет полезно посмотреть http://www.openframeworks.cc/forum/viewtopic.php?f=8&t=4505

smoke.h

#pragma once

#ifndef SMOKE
#define SMOKE

#include "ofMain.h"
#include "VSquare.h"
#include "VBuffer.h"
#include "Particle.h"

#define LWIDTH 151
#define LHEIGHT 11

class Smoke {
public:
int WIDTH;
int HEIGHT;

int RES;
int PENSIZE;


int PNUM;


VSquare v [LWIDTH] [LHEIGHT] ;
VBuffer vbuf [LHEIGHT][LHEIGHT] ;

Particle p [30000];

int pcount;
int mouseXvel;
int mouseYvel;

int randomGust;
int randomGustMax;
float randomGustX;
float randomGustY;
float randomGustSize;
float randomGustXvel;
float randomGustYvel;

Smoke();

void init();
void draw();

};
#endif

Код в моем файле .cpp выглядит следующим образом:

#include "Smoke.h"


Smoke::Smoke(){
WIDTH = 300; //these are the variables that go out of scope in all other classes
HEIGHT = 300;

RES = 2;
PENSIZE = 30;


PNUM = 30000;

pcount = 0;
mouseXvel = 0;
mouseYvel = 0;

randomGust = 0;
}

и один из классов, с которыми у меня возникла проблема:

Particle.h

#ifndef PARTICLE
#define PARTICLE

#include "ofMain.h"


class Particle{
public:
float x;
float y;
float xvel;
float yvel;
float temp;
int pos;

Particle(float xIn = 0, float yIn = 0);

void reposition();
void updatepos();



};
#endif

и файл .cpp, в который выдается ошибка (отрывок):

#include "Particle.h"

Particle::Particle(float xIn, float yIn){
x = xIn;
y = yIn;

}

void Particle::reposition() {
x = WIDTH/2+ofRandom(-20,20); //eg, WIDTH and HEIGHT not declared in this scope
y = ofRandom(HEIGHT-10,HEIGHT);

xvel = ofRandom(-1,1);
yvel = ofRandom(-1,1);
}

void Particle::updatepos() {
int vi = (int)(x/RES); //RES also not declared in this scope
int vu = (int)(y/RES);

if(vi > 0 && vi < LWIDTH && vu > 0 && vu < LHEIGHT) {
v[vi][vu].addcolour(2);
//and so on...

Действительно надеюсь, что это то, что люди могут помочь мне разобраться!Большое спасибо

Ответы [ 3 ]

1 голос
/ 28 августа 2010

Если предполагается, что ШИРИНА и ВЫСОТА являются константами, вы можете переместить их из Smoke и просто объявить их как константы: const int WIDTH = 300; Если они должны быть членами Smoke, но все еще являются константами, тогда просто объявите их как static const int WIDTH = 300 затем #include "Smoke.h" в вашем Particle.cpp и ссылаться на него как Smoke::WIDTH.Это похоже на общедоступную статическую переменную в Java.Если каждому объекту Smoke нужна своя ширина, вам нужно указать объекту Particle, какой объект Smoke ему нужен, или передать WIDTH и HEIGHT конструктору Particle.

0 голосов
/ 28 августа 2010

Экземпляр класса Smoke понадобится, если вы хотите получить доступ к WIDTH и HEIGHT, поскольку они определены в настоящее время, потому что они являются частью класса smoke.

Измените свой метод, чтобы получить экземпляр Smoke изатем используйте его в следующем методе:

void Particle::reposition(Smoke& smoke) {  
x = smoke.WIDTH/2+ofRandom(-20,20); //eg, WIDTH and HEIGHT not declared in this scope  
y = ofRandom(smoke.HEIGHT-10, smoke.HEIGHT);  

xvel = ofRandom(-1,1);  
yvel = ofRandom(-1,1);  
}  

int main() {  
Smoke smoke;  
Particle particle;  
particle.reposition(smoke);  
}  
0 голосов
/ 28 августа 2010

Переменные объявлены в области видимости класса Smoke, поэтому: а) они не являются глобальными, и б) вам понадобится экземпляр объекта Smoke, чтобы получить к ним доступ. Вам нужно #include "Smoke.h", а также создать / получить экземпляр объекта Smoke, а затем использовать, например. mySmoke.WIDTH.

Если вы хотите, чтобы переменные были «глобальными», вам нужно объявить их вне области действия класса Smoke - но вам все равно нужно #include соответствующий заголовок.

...