我正在从零开始构建分子动力学模拟以练习我的新c ++技能,但我遇到了一些麻烦。
在模拟'box'对象中,我有一个私有变量L,它包含系统的长度。 同样在'box'对象里面我有一个'粒子'对象的向量(不是从'box'以任何方式派生的)。 “粒子”对象包含粒子的标准化位置(每个维度中0到1)。 我需要一种从'粒子'对象中访问L的方法。我需要这个,以便我可以使用它来乘以标准化位置,以便在需要时获得实际位置(标准化位置在大多数情况下更方便工作)。
对L的这种访问应该是只读的,而不是生成L的副本,而是所有粒子在更改时应该引用相同的L(例如,框被展开)。
我想到在初始化时可能会向每个'粒子'对象传递一个对L的const引用。 这真的是最好的方式吗? 有没有办法做到这一点,不涉及在构造函数中传递给每个'粒子'对象? (因为我可能不得不将更多这样的“状态变量”传递给每个'粒子')
感谢。
编辑:我正在附上代码并解决@ 1201ProgramAlarm的建议,这似乎有意义,但我在实施时遇到了问题:
Particle_Class.h
class Box_Class;
class point;
class Particle_Class
{
public:
Particle_Class(Box_Class &box);
private:
const Box_Class &box;
point velByL;
};
Particle_Class.cpp
Particle_Class::Particle_Class(Box_Class &box)
:box(box){}
void Particle_Class::init_P(const point pt){velByL=pt*box.get_L()/mass; return ;};
Box_Class.cpp
for (int i=0;i<initN;i++)
particle.emplace_back(*this);
不幸的是,我在行void Particle_Class :: init_P
中遇到编译器错误“错误:无效使用不完整类型'const类Box_Class'|”
答案 0 :(得分:1)
您可以将box
对象的指针传递给particle
个对象,并在box
中为L
提供一个getter方法。该指针可以传递给particle
的构造函数,并存储在对象中,或者可以传递给需要访问它的particle
的成员函数。
答案 1 :(得分:1)
由于particle
只有一个标准化位置,因此决定粒子实际位置的是box
。所以你的box
对象应该有一个方法来返回给定粒子的实际位置:
struct Particle { float x, y; /* maybe other properties */ };
struct Position { float x, y; };
struct Box {
Position position(Particle const& p) {
return {p.x * L, p.y * L};
}
private:
float L;
};
通过这种方式,您不需要particle
来使用box
,并且您不需要particle
来访问私人会员,并且您不需要#39;需要一个访问者。
粒子会更好地了解它的真实位置吗?
答案是否定的。粒子不需要知道它的真实位置。
让我们假设你想在一个盒子里绘制一堆粒子,那么你不仅需要粒子,还需要盒子。但是粒子本身并不需要盒子。
将粒子从一个盒子移动到另一个盒子也很简单:你只需要向绘图函数发送一个不同的盒子和/或将粒子矢量移动到另一个盒子的矢量。没有复制,没有更改引用,没有问题。
答案 2 :(得分:0)
您可以在框中创建一个getter方法以允许访问L.它可能看起来像
public:
int GetL(){
return L;
}
然后,让你的particle
个对象调用该方法来读取L的值。
如果L的公共访问者不受欢迎(可能出于安全原因),您可以将粒子声明为朋友。这是一个c ++功能,允许粒子直接私有成员的框。有些人认为“朋友”是不好的编码习惯。这也引发了关于允许朋友访问私人会员的笑话。
friend particles[];
答案 3 :(得分:0)
如果我理解正确,L是您实施的私人部分,并且您不希望在您的界面中公开公共获取者。
我过去使用的一个解决方案是创建一个辅助类,它暴露两个类之间共享的状态 - 在这种情况下,它可能被称为BoxParticleInterface。
界面可以由Box创建,并在构建时传递给Particle。
class BoxParticleInterface
{
BoxParticleInterface( L const & l, Etc const & etc ) : l_( l ) { }
L const & l() { return l_; }
L l_;
}
这可能比传递单个引用/指针更有用:
a)它逻辑上将从Box传递给粒子的成员分组,以及
b)如果你有更多想要沟通的状态,它会更容易扩展。