使用 getter/setter 在类之间传递值
Posted
技术标签:
【中文标题】使用 getter/setter 在类之间传递值【英文标题】:Passing values between classes using getters/setters 【发布时间】:2016-11-22 19:00:32 【问题描述】:我在 C++/JUCE 项目中有 3 个类:KeyboardGUI、Chord 和 Audio。
KeyboardGUI 收到一个名为 rootNote 的 int,需要将其提供给 Chord。
然后,Chord 需要将此值赋予 Audio。
我正在尝试使用 getter/setter 来实现这一点,但我不确定使用它们的方式:即:我是否从键盘 GUI 设置和弦,并从 Chord 设置音频,或者我是否从键盘 GUI 获取和弦,并从和弦到音频。
据我所知,我需要在 KeyboardGUI 或 Audio 中创建 1 个 Chord 实例,并使用指针从其他类访问此实例,但我不知道如何实现。
我应该获取/设置哪个方向?我应该在哪里使用实例或指针?
从KeyboardGUI设置到和弦的功能
void KeyboardGUI::handleNoteOn (MidiKeyboardState* source, int midiChannel, int midiNoteNumber, float velocity)
//IS THIS CORRECT?
chord.setRootNote(midiNoteNumber);
Chord.CPP 中的 Getter/Setter 函数
void Chord::setRootNote(int newNote)
rootNote = newNote;
int Chord::getRootNote()
return rootNote;
;
这里我需要访问rootNote并将其放入一个新变量中
void Audio::playChord()
//get root note from chord - use pointer??;
我应该在我的音频类中使用指针吗?
【问题讨论】:
这真的取决于你想要流入的方向。两者都应该没问题。如果KeyboardGUI
正在启动Chord::rooteNote
的更改,那么它应该设置它并且Chord
可以在需要时使用它。同样,Audio
在需要的时候可以得到Chord::rootNote
。由于您在 Chord
类中设置了 getter/setter 函数,因此我将在 Audio::playChord
中将其用于 get
和 chord->getRootNote()
如果我以这种方式实现它,是否可以从我的 Chord 类中调用 Audio::playChord?
你的类需要引用它使用的任何类。也许该引用是存储在堆栈上的类中的实际对象,或者它可能是存储在堆上的对象。这个选择取决于你作为程序员。通常堆是首选的,只有一个指针存储在类中,但是你必须明确地清理你使用的内存。否则会出现内存泄漏。
@SteffanDavies 是的,你可以。获取指向Audio
对象的指针并调用Audio->playChord
你必须弄清楚发生了什么。和弦是在弹钢琴,还是钢琴在弹和弦?尾巴在摇狗吗?
【参考方案1】:
下面是一个示例,说明您可以如何做到这一点。我不确定哪个类的层次结构会使用哪个,所以我只是决定 Audio 是最重要的,它随意使用 Class Chord。使用对您最有用的东西。
音频.h
class Audio
public:
Chord * myChordPTR; //option 1 variable myChordPTR of type pointer to Chord
Chord myChord; //option 2 actual chord object stored on the stack
Audio();
~Audio();
void playChord();
音频.cpp
Audio::Audio()
myChordPTR = new Chord(); //instantiates a Chord object on the heap
Audio::~Audio()
delete myChordTRP; //frees the memory of the object that was on the heap
void Audio::playChord()
int rootNode = myChordPTR->getRootNode();
int otherRootNode = myChord.getRootNode();
看到myChordPTR
是一个指针,它允许Audio
类使用Chord
类型的对象吗?
这里的重点是当一个类尝试使用另一个类的方法时,它需要某种方式来引用该类的特定对象(除非它只使用静态方法)。
请注意,箭头运算符->
用于访问指针的成员,而点运算符.
用于访问对象本身的成员。
我没有包含 KeyboardGUI
类以尽量减少此答案,但我认为使用我提供的内容您应该能够弄清楚。
【讨论】:
以上是关于使用 getter/setter 在类之间传递值的主要内容,如果未能解决你的问题,请参考以下文章