从属于同一 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 将粒子的向量移动到另一个盒子的向量。无需复制,无需更改引用,没问题。
我正在从头开始构建分子动力学模拟以练习我的新 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 将粒子的向量移动到另一个盒子的向量。无需复制,无需更改引用,没问题。