Чтобы ответить на первый вопрос, вы можете просто включить data.h в energy.cpp.
#include "data.h"
К сожалению, вы создали «деталь» в глобальном пространстве, поэтому каждый файл .cpp будет создавать ее независимо.Когда он будет ссылаться на объектные файлы, он увидит, что существует множество ссылок на «часть».Здесь вы можете использовать ключевое слово "extern", а в data.h вы просто объявите его как внешнюю переменную.Или, поскольку вы ссылаетесь только на «part» в main.cpp, вы можете просто перенести туда глобальное определение, и проблема будет решена.
Теперь, когда дело доходит до того, что вы сделали в energy.cpp,Вы создали отдельную переменную, также называемую «часть».Когда применяются правила области видимости, это означает, что компилятор будет принимать локальное определение поверх глобального определения.Поскольку вы передаете объект класса, а не массив классов, вы получите ошибку компилятора при ссылке на него как «part [0] .mass».Вместо этого, почему вы беспокоитесь о ценности другой частицы, а не частицы, в которой вы прошли?Если вам нужна масса конкретного объекта Particle, то вы должны написать это как «part.mass»
Конечно, я бы сказал, что вы действительно хотите создать функцию-член для энергии внутри Particle.Прямо сейчас вы используете классы в стиле структуры Си.Это означает, что вам не хватает возможности использовать все объектно-ориентированное совершенство, которое может предложить C ++.Вы можете сделать это следующим образом
class Particle
{
protected:
double mass;
double charge;
double posx,posy,posz;
public:
void SetMass(double newMass) { mass = newMass; }
void SetCharge(double newCharge) { charge = newCharge; }
void SetX(double newX) { posX = newX; }
void SetY(double newY) { posY = newY; }
void SetZ(double newZ) { posZ = newZ; }
double GetEnergy() { return 2.0; }
};
Чтобы ответить на ваш второй вопрос, C ++ предполагает, что вы знаете больше о памяти, чем он.В GCC (AFAIK) нет проверки границ, потому что память может быть выделена где угодно в любое время и также освобождена.Однако, в отличие от других языков, вы должны сами управлять памятью.Это позволяет оптимизировать и обманывать C ++ (например, объявлять массив нулевого размера для неизвестных размеров и назначать ему блок памяти).
Приветствия!