2017-02-08 53 views
2

我正在從頭開始構建分子動力學模擬以練習我的新C++技巧,並且遇到了一些麻煩。從屬於同一類的一部分的對象中訪問類變量

在模擬盒子對象中,我有一個包含系統長度的私有變量L. 也'內'對象我有一個'粒子'對象的矢量(不是以任何方式從'框'派生)。 「粒子」對象包含粒子的標準化位置(每個維度0到1)。 我需要一種方法來訪問'粒子'對象內的L.我需要這個,以便我可以使用它來乘以標準化位置,以便在需要時獲得實際位置(標準化位置在大多數時間更方便地工作)。

對L的訪問應該是隻讀的,並且不會生成L的副本,而是所有粒子在改變的情況下都應該引用相同的L(例如,框被展開)。

我想可能會傳遞給每個'粒子'對象的一個​​常量引用,當他們被初始化。 這真的是最好的方法嗎? 有沒有辦法做到這一點,不涉及將其他構造函數中的每個'粒子'對象傳遞給它? (因爲我可能必須將更多這樣的「狀態變量」傳遞給每個「粒子」)

謝謝。

編輯:我附加代碼和地址@ 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); 

不幸的是我在該行無效Particle_Class得到一個編譯錯誤:: init_P

「錯誤:無效的使用不完全類型的 '常量類Box_Class' |」

+0

你可以在你的文章中包含你的代碼嗎?它可以讓你更容易得到答案 – RGA

回答

1

您可以將指向box對象的指針傳遞給particle對象,並在box中爲L提供獲取方法。這個指針可以傳遞給particle的構造函數,並存儲在該對象中,或者可以傳遞給需要訪問它的particle的成員函數。

+0

我沒有想過將引用傳遞給box對象,而不是將它自己的每個狀態參數傳遞給它。太好了,這應該起作用。 –

+0

但現在我遇到了執行麻煩。我得到錯誤:使用不完整類型'const類Box_Class(請參閱編輯後的文章) –

+0

@YoavPollack聽起來像你需要在particle_class.cpp中包含Box_Class頭。 – 1201ProgramAlarm

0

您可以創建在框中getter方法,以允許訪問L.它可能看起來像

public: 
    int GetL(){ 
     return L; 
    } 

然後,有你particle對象調用該方法來讀取L.

的價值

如果L的公共訪問者不受歡迎(可能出於安全原因),則可以將這些粒子聲明爲朋友。這是一個C++功能,它允許粒子直接私人成員的框。有人認爲「朋友」是不好的編碼習慣。這也導致了關於朋友被允許訪問私人成員的笑話。

friend particles[]; 
0

如果我正確理解你的話,是你實現的私處,你不希望你的接口公開一個公共的getter。

我過去使用的一種解決方案是創建一個助手類,它公開兩個類之間共享的狀態 - 在這種情況下,它可能被稱爲BoxParticleInterface。

該接口可以由Box創建並傳遞給構造上的粒子。

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

這可能是比在周圍通過一個單一的參考/指針更加有用:
一)它在邏輯組被從盒傳遞到粒子的成員,
B)這是一個有點容易如果你有更多的狀態你想要溝通,擴展。

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訪問私有成員的框,並且你不需要訪問器。


請問顆粒知道它的真正位置好?

答案是否定的。粒子不需要知道它的真實位置。假設你在一個盒子裏有一堆粒子,那麼你不僅需要粒子,而且還需要盒子。但粒子本身並不需要盒子。

它也可以將粒子從一個盒子移動到另一個盒子:你只需要發送一個不同的盒子到繪圖函數和/或移動粒子的矢量到另一個盒子的矢量。沒有複製,沒有改變引用,沒有問題。

+0

您的解決方案似乎是面向對象的最佳解決方案。然而在考慮之後,我決定不使用它,因爲這意味着在盒子課程中的任何地方都會使用規範化的單元,這會造成滋擾,並可能導致我的錯誤。雖然謝謝! –

+0

@YoavPollack你可以創建一個指向particle的指針和一個指向BoxedParticle的指針,該指針具有一個'normalized()'和'real()'訪問器,並將這個包裝器傳遞到需要粒子的地方, 。它甚至有可能更快,更高效地存儲內存,並且具有我解決方案的所有優點。 –

相關問題