我使用不同的类访问方法和参数时遇到问题,我以前用Java编写代码,所以我没有问题可以使用其他范围的函数。
class Ball;
class Canvas4 {
public:
static const int num = 100;
vector<Ball> ballCollection;
Ball *myBall;
Ball getBallById(int id) {
return this->ballCollection.at(id)
};
};
class Ball {
friend class Canvas4;
public:
void lineBetween() {
for (int i=0; i<Canvas4::num; i++) {
Ball other = Canvas4::ballCollection.at(i);
//*Invalid use of non-static data member "ballCollection"
}
};
};
*无效使用非静态数据成员“ballCollection”
我想通过Id阅读某些Ball Object的内容并用它绘制一些艺术作品。
修改
在我做的另一堂课上。
#include "canvas4.h" //which contains both classes Ball and Canvas4
Canvas4 canvas4;
答案 0 :(得分:0)
您需要Canvas4类型的类对象才能使用Ball类中的非静态成员函数。 只有在类中具有限定符作为静态的成员函数才能以“Class :: Function”格式使用。
修改强>
class Ball {
public:
Canvas4 *cv;
Ball(ofVec2f _org, ofVec2f _loc, float _radius, int _dir, float _offSet, Canvas4 *_cv):
org(_org),loc(_loc),radius(_radius), dir(_dir), offSet(_offSet),cv(_cv){}
void Ball::lineBetween() {
for (int i=0; i<Canvas4::num; i++) {
Ball other = cv->getBallById(i);
float distance = loc.distance(other.loc);
if (distance >0 && distance < d) {
ofLine(loc.x, loc.y, other.loc.x, other.loc.y);
}
}
}
};
如上所示,您必须在构造函数中启用类变量。
答案 1 :(得分:0)
正如评论中已经提到的,通过在类名上应用::
来访问类的静态成员,在类的对象上应用.
的非静态成员,例如
struct A
{
int x;
static int y;
};
void f(A a)
{
a.x = 1;
A::y = 2;
};
您正试图访问ballCollection
,就好像它是静态成员一样,而不是。{/ p>
答案 2 :(得分:-1)
我使用@Igor的建议找到的解决方案只是在Ball类中插入指向Canvas的指针:
class Ball {
public:
Canvas4 *cv;
Ball(ofVec2f &_org, ofVec2f &_loc, float _radius, int _dir, float _offSet, Canvas4 &_cv);
void Ball::lineBetween() {
for (int i=0; i<Canvas4::num; i++) {
Ball other = cv->getBallById(i);
float distance = loc.distance(other.loc);
if (distance >0 && distance < d) {
ofLine(loc.x, loc.y, other.loc.x, other.loc.y);
}
}
}
};