Как я могу инициализировать этот класс в массиве?

Я пытаюсь сделать массив класса filePlayerGui, и когда я пытаюсь инициализировать его в конструкторе, он не позволит мне сделать это

class MainComponent   : public Component,
public MenuBarModel
{
public:
//==============================================================================
/** Constructor */
MainComponent (Audio& audio_);

/** Destructor */
~MainComponent();

void resized() override;

//MenuBarEnums/Callbacks========================================================
enum Menus
{
FileMenu=0,

NumMenus
};

enum FileMenuItems
{
AudioPrefs = 1,

NumFileItems
};
StringArray getMenuBarNames() override;
PopupMenu getMenuForIndex (int topLevelMenuIndex, const String& menuName) override;
void menuItemSelected (int menuItemID, int topLevelMenuIndex) override;

private:
Audio& audio;
FilePlayerGui filePlayerGui[2] {audio.getFilePlayer(0), audio.getFilePlayer(1)};//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};

FilePlayerGui появляется с этой ошибкой «Копирование элемента массива типа ‘FilePlayerGui’ вызывает удаленный конструктор». Я попытался инициализировать его в файле .cpp, который я опущу ниже, но затем он говорит мне, что мне нужен инициализатор массива

MainComponent::MainComponent (Audio& audio_) : audio (audio_)
{setSize (500, 400);
addAndMakeVisible(filePlayerGui[0]);
addAndMakeVisible(filePlayerGui[1]);
}

MainComponent::~MainComponent()
{

}

void MainComponent::resized()
{
filePlayerGui[0].setBounds (0, 0, getWidth(), 40);
}

//MenuBarCallbacks==============================================================
StringArray MainComponent::getMenuBarNames()
{
const char* const names[] = { "File", 0 };
return StringArray (names);
}

PopupMenu MainComponent::getMenuForIndex (int topLevelMenuIndex, const String& menuName)
{
PopupMenu menu;
if (topLevelMenuIndex == 0)
menu.addItem(AudioPrefs, "Audio Prefrences", true, false);
return menu;
}

void MainComponent::menuItemSelected (int menuItemID, int topLevelMenuIndex)
{
if (topLevelMenuIndex == FileMenu)
{
if (menuItemID == AudioPrefs)
{
AudioDeviceSelectorComponent audioSettingsComp (audio.getAudioDeviceManager(),
0, 2, 2, 2, true, true, true, false);
audioSettingsComp.setSize (450, 350);
DialogWindow::showModalDialog ("Audio Settings",
&audioSettingsComp, this, Colours::lightgrey, true);
}
}
}

2

Решение

Копирование элемента массива типа FilePlayerGui вызывает удаленный конструктор

Означает, что какой-то вариант этой строки находится в объявлении FilePlayerGui:

FilePlayerGui(const FilePlayerGui&) = delete

Это означает, что FilePlayerGui не может быть скопировано: https://en.cppreference.com/w/cpp/language/copy_constructor#Deleted_implicitly-declared_copy_constructor

Есть обходные пути, но вы обходите автора FilePlayerGuiнамерение для класса. Поэтому правильный ответ должен остановиться здесь. Любое использование FilePlayerGui должно быть сделано через классы audio член, используя либо: audio.getFilePlayer(0) или же audio.getFilePlayer(1), (Если это единственный член MainComponent по всей вероятности MainComponent должны быть устранены.)


Если вы хотите знать, как делать плохие вещи, которые я бы отверг в любом обзоре кода, вы можете создать filePointerGui как:

  1. FilePointerGui* filePointerGui[2] который будет инициализирован как:
MainComponent::MainComponent(Audio& audio_) : audio(audio_), filePointerGui({ &audio.getFilePlayer(0), &audio.getFilePlayer(1) })

       Доступ будет осуществляться как:

*filePointerGui[0]

       Живой пример

  1. reference_wrapper<FilePointerGui> filePointerGui[2] который будет инициализирован как:
MainComponent::MainComponent(Audio& audio_) : audio(audio_), filePointerGui({ audio.getFilePlayer(0), audio.getFilePlayer(1) })

       Доступ будет осуществляться как:

filePointerGui[0].get()

       Живой пример

Вероятно, стоит еще раз подчеркнуть, что это плохой код, потому что он пытается перехитрить язык и обойти замысел разработки классов. Но это так что вы Можно сделай это.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector