使用 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 中将其用于 getchord->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 在类之间传递值的主要内容,如果未能解决你的问题,请参考以下文章

Dart中类的getter和setter

Java 封装

超级全面的 Lombok 注解介绍,学一波

Java— 封装

[在C ++中没有getter setter的访问成员

Angular @Input getter/setter 和非原始值