2014-09-06 2 views
-2

У меня возникли проблемы с методами доступа и параметрами с использованием разных классов, которые я использовал для кодирования Java, поэтому у меня нет проблем с использованием функций других областей.Извлечение данных из разных классов в C++

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»

Я хочу, чтобы прочитать содержание определенного мячьего объекта по идентификатору и сделать некоторые искусства с ним.

EDIT

В другом классе я сделал.

#include "canvas4.h" //which contains both classes Ball and Canvas4 

Canvas4 canvas4; 
+0

Так же, как и в Java, вам нужно экземпляр класса 'Canvas4', прежде чем вы можете получить доступ к его нестатические элементы. –

+0

Я устанавливаю Canvas4 canvas4; В основном классе. – cleliodpaula

+0

Итак, передайте ссылку на этот экземпляр в качестве параметра 'lineBetween' или что-то в этом направлении. В программе может быть несколько агитаций; как иначе 'lineBetween' должен знать, чью коллекцию шара он должен смотреть? –

ответ

0

Вам нужен объект класса типа Canvas4 для использования нестатической функции-члена в классе Ball. Только функции-члены, имеющие классификатор как статические в классе, могут использоваться в формате «Класс :: Функция».

EDIT

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

Необходимо, чтобы вы intilaize переменные класса в конструкторе, как показано выше.

0

Как уже упоминалось в комментариях, к статическим членам класса обращаются путем применения :: к имени класса, а нестатические элементы - к объекту класса, например, к ..

struct A 
{ 
    int x; 
    static int y; 
}; 

void f(A a) 
{ 
    a.x = 1; 
    A::y = 2; 
}; 

Вы пытаетесь получить доступ к ballCollection, как если бы это был статический член, который это не так.

-1

Решение, которое я нашел, используя предложение по @Igor просто вставить указатель на 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); 
     } 
    } 
} 
}; 
Смежные вопросы