变量如何被一组类使用?

时间:2010-08-27 23:19:49

标签: c++ variables class scope

我有一个我似乎无法理解的问题,因为它对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

和抛出错误的.c​​pp文件(摘录):

#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 个答案:

答案 0 :(得分:1)

如果WIDTH和HEIGHT应该是常量,你可以将它们移出Smoke并将它们声明为常量:const int WIDTH = 300;如果它们需要是Smoke的成员但仍然是常量,那么只需声明它们在您的Particle.cpp中为static const int WIDTH = 300然后#include "Smoke.h",并将其引用为Smoke::WIDTH。这就像Java中的公共静态变量。如果每个Smoke对象都需要自己的宽度,那么您需要告诉Particle对象它需要哪个Smoke,或者将WIDTH和HEIGHT传递给Particle构造函数。

答案 1 :(得分:0)

变量是在Smoke类的范围内声明的,因此a)它们不是全局的,并且b)你需要一个Smoke对象的实例来获取它们。您需要#include“Smoke.h”,并创建/获取Smoke对象的实例,然后使用例如mySmoke.WIDTH

如果您希望变量为“全局”,则需要在Smoke类的范围之外声明它们 - 但您仍需要#include相关标题。

答案 2 :(得分:0)

如果您想要访问当前定义的宽度和高度,则需要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);  
}