从属于同一类

时间:2017-02-08 18:29:09

标签: c++ simulation modeling

我正在从零开始构建分子动力学模拟以练习我的新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'|”

4 个答案:

答案 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)如果你有更多想要沟通的状态,它会更容易扩展。