在C ++中从不同的类中检索数据

时间:2014-09-06 18:59:35

标签: c++ class vector

我使用不同的类访问方法和参数时遇到问题,我以前用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;

3 个答案:

答案 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);
        }
    }
}
};