2013-09-12 2 views
3

Я пытаюсь создать что-то вроде следующего, используя C++:Где я могу хранить функцию, которая действует на массив объектов?

enter image description here

У меня есть класс с именем частица, которая сохранит положение, скорость каждой частицы. Кроме того, функция-член обновляет положение частицы с использованием данных скорости.

Я также пытаюсь написать функцию, которая обнаружит столкновение частиц с границами поля. Для этого эта функция нуждается в доступе к позиции и скорости каждой частицы. Таким образом, функция должна принимать целый массив частиц в качестве параметра. Однако эта функция не может существовать как членная функция класса частиц, потому что тогда она не будет иметь доступа ко всем частицам.

Вопрос: Где я могу включить функцию обнаружения столкновений, чтобы она была расширяемой частью класса частиц?

Я подумал о том, чтобы просто написать эту функцию внутри моего файла main.cpp, но я не имею ни малейшего понятия, придерживается ли это правил ООП. В идеале могут быть и другие функции, которые также действуют на массив частиц.

+1

Независимо от того, кто «владеет», частицы, вероятно, будут местом для обнаружения столкновения частиц. В этом случае все, что принадлежит списку частиц и отвечает за их управление. (и +1 для большинства образцов вашего лица, которые вы пытаетесь сделать, я видел в вопросе в течение длительного времени). – WhozCraig

+0

Расширяемость в каком направлении? «Очевидным» ответом является статическая функция-член, но это может зависеть от роли этого класса 'particle' (в основном, он предназначен для использования в качестве базового класса или нет) и того, как вы хотите представлять ограничительную рамку. Также имейте в виду, что большое количество кода на C++ (возможно, большинство) и почти всех стандартных библиотек C++ разработаны * без * указаний по ООП. C++ допускает другие парадигмы программирования, чем просто ООП. –

+0

Также +1 для GIF! – Keith

ответ

0

Возможно, что-то вроде объекта «ParticleContainer», который содержит массив частиц и выполняет операции над системой частиц в целом.

(Это также, где вы бы поставить код, который работает вниз массив и вызывает «Draw» функции.)

0

Я думаю, что хорошая идея будет объявить функцию обнаружения как друг класс частиц: он будет иметь доступ ко всем членам класса. Затем вы можете запустить эту функцию в цикле внутри некоторой функции менеджера, которая будет вычислять столкновение со всеми частицами в массиве. В этом

void CollisionMgr(particleClass *ParticleArrayPtr, int NumOfParticles) 
{ 
    while(NumOfParticles) 

    { 
     CollisionOfParticle(*ParticleArrayPtr, NumOfParticles); 
     NumOfParticles--; 
    } 

} 
+0

Предпочитайте 'std :: vector' raw-указатель на массив. – Manu343726

0

Я предпочитаю использовать шаблон вдоль этих линий: Держите все состояния модели в одном классе под названием Model или Environment; имеют отдельный класс Renderer, который знает, как нарисовать состояние модели; имеют класс System, который связывает их вместе. Ниже приводится краткое сокращение, но, надеюсь, дается идея:

class Box {}; 

class Location {}; 

class Particle 
{ 
public: 
    void updatePosition(double dt); 
    const Location& getLocation(); 
}; 

class Environment 
{ 
public: 
    void checkForCollisions(); 
private: 
    Box box; 
    std::vector<Particle> particles; 
}; 

class Renderer 
{ 
public: 
    void render(Environment& environment); 
}; 

class System 
{ 
    Environment environment; 
    Renderer renderer; 
}; 
Смежные вопросы