首页 > 解决方案 > 说明此场景中的类和范围

问题描述

我目前正在使用 JUCE 框架创建一个音频 VST 插件来掌握和学习,但只是想澄清一些与课程相关的基本内容。

在我的头文件中,我有一个类EQPLUGProcessor,并且在该类中我调用static juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout();

当我在 .cpp 中调用该函数createParameterLayout()时,我必须编写juce::AudioProcessorValueTreeState::ParameterLayout EQPLUGAudioProcessor::createParameterLayout(){}

我的问题是,为什么我必须 juce::AudioProcessorValueTreeState::ParameterLayout在函数所在的实际范围之前包含 ( EQPLUGAudioProcessor)?当然,我应该告诉编译器查看,仅此 EQPLUGAudioProcessor而已?

我知道那EQPLUGAudioProcessor是它全部在里面的类,但似乎仍然无法理解何时、何地以及为什么我需要在 .cpp 中再次阐明该函数来自的类?

让我知道这是否需要澄清。

标签: c++juce

解决方案


封闭的命名空间或类不必仅在同一命名空间或类中指定:

class store {

    class give_me {

    // ...

    };

    static give_me something_cool();
};

这里,something_cool() 的声明只需要引用give_me,而不需要store::give_me. 这是因为该声明出现其类的声明中。

现在已经声明了这个类,是时候定义它的类方法了,所有的东西都必须拼写出来:

store::give_me store::something_cool()
{
      // ...
}

如果类方法返回 avoid而不是你仍然必须编写如下内容:

void store::something_cool()
{
      // ...
}

你已经明白了,你不能只写void something_cool() 并定义这个类方法。这只会用这个名字定义一些不相关的函数。

您必须编写store::something_cool,因为此定义不再出现在store范围内。

好吧,同样的事情不仅适用于类方法,也适用于内部类(以及在某些封闭范围内声明的其他类型的符号)。由于give_me不是在全局范围内声明的类,它是一个内部类,当在全局范围内时,您必须将其引用为store::give_me.

这就是 C++ 的工作原理。还有各种复杂的规则来定义作用域的开始和结束位置,就 C++ 的语法而言,这与此相关。在某些情况下,可以利用这些范围规则并通过使用auto带有尾随返回类型的声明来避免显式范围引用;但是如何做到这一点将在其他时候成为一个不同的问题。


推荐阅读