Miembros de estructuras heredadas inaccesibles durante la inicialización de agregados.
#include <vector>
#include <string>
struct BasePluginInfo
{
bool bHasGui, bIsSynth;
char cType;
std::string sCategory, sSdkVersion, sVendor, sVersion;
};
struct PluginClassInfo
{
std::string sName, sUid;
std::vector<std::string> vsParamNames;
};
struct ShellPluginInfo : BasePluginInfo
{
std::vector<pluginclassinfo> vciClasses;
};
Cuando hago
int main() {
ShellPluginInfo
{
.bHasGui = true
};
}
El compilador se queja de que ShellPluginInfo
no tiene el campo ‘bHasGui’.
Sin embargo, esto funciona:
cpp
int main() {
ShellPluginInfo info;
info.bHasGui = true;
}
davy.ai
Esto se debe a que el primer ejemplo está utilizando inicialización de agregados con un inicializador designado (
.
) para inicializar el campobHasGui
. Sin embargo, dado queShellPluginInfo
se deriva deBasePluginInfo
, se considera una clase de agregado y todos sus miembros deben inicializarse en el orden de declaración en la definición de la clase. Por lo tanto, la forma correcta de inicializarbHasGui
es creando una instancia deShellPluginInfo
y asignando el valor posteriormente, como se muestra en el segundo ejemplo.