В настоящее время я программирую свое первое приложение, следуя инструкциям ChiliTomatoNoodle, и модифицирую его код в соответствии с моими потребностями. При этом и реализации простого класса WindowManager, целью которого является сохранение всех экземпляров окна в std :: vector и аналогичных вещах, я получил следующее сообщение об ошибке:
C: \ Program Files(x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ xmemory (758,1):
ошибка C2280: 'Window :: Window (const Window &)': попытка сослаться на удаленную функцию (компилирование исходного файла src \ cpp \ WindowManager.cpp)
Проблема, похоже, заключается в функции addWindow
, где окно создается и сохраняется в std::vector<Window> Wnd
:
void WindowManager::addWindow(unsigned short x, unsigned short y, unsigned short width, unsigned short height, const char* name, Window::WindowClass& windowClass, DWORD style) {
this->Wnd.emplace_back(Window(name, x, y, width, height, windowClass, style, this->IdGenNum++));
}
Я уже изменил push_back
на emplace_back
, чтобы, возможно, избежать копирования (?), Но это не решило проблему.
Тогда есть и геттер(это нормально и ничего не копируется):
Window& WindowManager::getWindow(const unsigned short id) {
for (Window &element : this->Wnd) {
if (element.Id == id) {
return element;
}
}
}
А вот заголовок класса Window
:
class Window {
private: // Friends
friend class WindowManager;
public: // Nested Classes
class WindowClass {
...
};
private: // Variables and Instances
unsigned short Id; // Received by WindowManager on Creation
const char* Name;
HWND Handle;
...
public: // Constructors and Deconstructors
Window(const Window&) = delete;
Window(
const char* name,
unsigned short x,
unsigned short y,
unsigned short width,
unsigned short height,
WindowClass& windowClass,
DWORD style,
unsigned short id
);
~Window();
private: // Functions
...
public: // Operators
Window& operator=(const Window&) = delete;
};
Редактировать:
Спасибо за все ответы и комментарии, указывающие на то, что аргументы должны быть переданы напрямуюк методу emplace_back
. Как оказалось, вектор все еще копировал объект (понятия не имею, почему ..), но я мог бы исправить это, используя вместо этого std::list
, который не имеет такого поведения.