从属于同一 class 的对象中访问 class 变量

Access to class variable from within objects that are part of same class

我正在从头开始构建分子动力学模拟以练习我的新 C++ 技能,但我 运行 遇到了一些麻烦。

在模拟'box'对象中,我有一个包含系统长度的私有变量L。 同样在 'box' 对象内部,我有一个 'particle' 对象的向量(不是以任何方式从 'box' 派生的)。 'particle' 对象包含粒子的归一化位置(每个维度中的 0 到 1)。 我需要一种从 'particle' 对象中访问 L 的方法。我需要这个,以便我可以用它来乘以标准化位置,以便在需要时获得实际位置(大多数时候标准化位置更方便使用)。

这种对 L 的访问应该是只读的,并且不会生成 L 的副本,而是所有粒子都应该引用同一个 L,以防它发生变化(例如,盒子被展开)。

我想也许在初始化时向每个 'particle' 对象传递一个对 L 的常量引用。 这真的是最好的方法吗? 有没有一种方法可以不涉及将某些内容传递给其构造函数中的每个 'particle' 对象? (因为我可能必须将更多这样的 "state variables" 传递给每个 'particle')

谢谢。

编辑:我正在附加代码并解决@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

行收到编译器错误

"error: invalid use of incomplete type 'const class Box_Class'|"

您可以将指向 box 对象的指针传递给 particle 对象,并在 box 中为 L 提供 getter 方法。该指针可以传递给 particle 的构造函数,并存储在对象中,或者可以传递给需要访问它的 particle 的成员函数。

您可以在框中创建一个 getter 方法以允许访问 L。它可能类似于

public:
    int GetL(){
        return L;
    }

然后,让您的 particle 对象调用该方法来读取 L 的值。

如果 L 的 public 访问器不受欢迎(可能出于安全原因),您可以将粒子声明为友元。这是一个 c++ 特性,允许粒子直接私有 box 的成员。有些人认为 "friend" 是不好的编码习惯。还闹出朋友被允许访问私人会员的笑话。

friend particles[];

如果我对你的理解正确,L 是你实现的私有部分,你不希望在你的界面中公开 public getter。

我过去使用的一个解决方案是创建一个助手 class 来公开两个 classes 之间共享的状态——在这种情况下它可能被称为 BoxParticleInterface。

界面可以由Box创建,并在构造时传递给Particle。

class BoxParticleInterface
{
    BoxParticleInterface( L const & l, Etc const & etc ) : l_( l ) { }
    L const & l() { return l_; }
    L l_;
}

这可能比传递单个引用/指针更有用:
a) 它逻辑上对从 Box 传递到 Particle 的成员进行分组,并且
b) 如果你有更多的状态想要交流,那么扩展起来会更容易一些。

由于particle只有一个归一化位置,决定粒子实际位置的是box。所以你的 box 对象应该有一个方法来 return 给定粒子的真实位置:

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来访问box的私有成员,你不需要需要访问器。


粒子知道它的真实位置会更好吗?

答案是否定的。粒子不需要知道它的真实位置。

假设您在某处有一堆粒子想要绘制在一个盒子中,那么您不仅需要粒子,还需要盒子。但是粒子本身不需要盒子。

这也使得将粒子从一个盒子移动到另一个盒子变得微不足道:您只需将一个不同的盒子发送到绘图函数 and/or 将粒子的向量移动到另一个盒子的向量。无需复制,无需更改引用,没问题。