Arhn - архитектура программирования

как использовать вектор для хранения формы?

Сначала я создаю окно, затем я создаю ряд прямоугольников и помещаю их в вектор, а затем доходит до проблемы. Код не может построить. Но я не знаю почему. Разве что я не могу использовать вектор таким образом "вектор прямоугольный";

#include <vector>
#include<string>
#include "Graph.h" // get access to our graphics library facilities
#include "Simple_window.h" 
int main()
{

Graph_lib::Point tl{ 100, 100 }; 

Simple_window win{ tl, 1000, 800, "Simple Window" }; 

int x_size = 800;
int y_size = 800;

using namespace std;
vector<Graph_lib::Rectangle> rect;//error
for (int x = 0, y = 0; x < x_size&&y < y_size; x += x_grid, y += y_grid)
{
    Graph_lib::Rectangle r(Graph_lib::Point(x, y), x_grid, y_grid);
    r.set_fill_color(Graph_lib::Color::red);
    rect.push_back(r);
}

for (int i = 0; i < 8; i++)
    win.attach(rect[i]);
win.attach(grid);
win.wait_for_button(); 

return 0;
}

D:\Visual Studio Community 2017\VC\Tools\MSVC\14.11.25503\include\xmemory0(856): ошибка C2280: 'Graph_lib::Rectangle::Rectangle(const Graph_lib::Rectangle &)': попытка сослаться на удаленная функция

D:\VS_practice\ChengLu_C13Drill\include\Graph.h(311): note: compiler has generated 'Graph_lib::Rectangle::Rectangle' here

D:\Visual Studio Community 2017\VC\Tools\MSVC\14.11.25503\include\vector(958): note: see reference to function template instantiation 'void std::_Default_allocator_traits<_Alloc>::construct<_Ty,const _Ty&>(_Alloc &,_Objty *const ,const _Ty &)' being compiled
        with
        [
            _Alloc=std::allocator<Graph_lib::Rectangle>,
            _Ty=Graph_lib::Rectangle,
            _Objty=Graph_lib::Rectangle
        ]

D:\Visual Studio Community 2017\VC\Tools\MSVC\14.11.25503\include\vector(958): note: see reference to function template instantiation 'void std::_Default_allocator_traits<_Alloc>::construct<_Ty,const _Ty&>(_Alloc &,_Objty *const ,const _Ty &)' being compiled
        with
        [
            _Alloc=std::allocator<Graph_lib::Rectangle>,
            _Ty=Graph_lib::Rectangle,
            _Objty=Graph_lib::Rectangle
        ]

D:\Visual Studio Community 2017\VC\Tools\MSVC\14.11.25503\include\vector(981): note: see reference to function template instantiation 'void std::vector<T,std::allocator<_Ty>>::emplace_back<const _Ty&>(const _Ty &)' being compiled
        with
        [
            T=Graph_lib::Rectangle,
            _Ty=Graph_lib::Rectangle
        ]

D:\Visual Studio Community 2017\VC\Tools\MSVC\14.11.25503\include\vector(980): note: while compiling class template member function 'void std::vector<T,std::allocator<_Ty>>::push_back(const _Ty &)'
        with
        [
            T=Graph_lib::Rectangle,
            _Ty=Graph_lib::Rectangle
        ]

D:\VS_practice\ChengLu_C13Drill\src\main.cpp(32): note: see reference to function template instantiation 'void std::vector<T,std::allocator<_Ty>>::push_back(const _Ty &)' being compiled
        with
        [
            T=Graph_lib::Rectangle,
            _Ty=Graph_lib::Rectangle
        ]

d:\vs_practice\chenglu_c13drill\include\std_lib_facilities.h(72): note: see reference to class template instantiation 'std::vector<T,std::allocator<_Ty>>' being compiled
        with
        [
            T=Graph_lib::Rectangle,
            _Ty=Graph_lib::Rectangle
        ]

D:\VS_practice\ChengLu_C13Drill\src\main.cpp(27): note: see reference to class template instantiation 'Vector<Graph_lib::Rectangle>' being compiled

D:\VS_practice\ChengLu_C13Drill\include\Graph.h(311): note: 'Graph_lib::Rectangle::Rectangle(const Graph_lib::Rectangle &)': function was implicitly deleted because a base class invokes a deleted or inaccessible function 'Graph_lib::Shape::Shape(const Graph_lib::Shape &)'

D:\VS_practice\ChengLu_C13Drill\include\Graph.h(232): note: 'Graph_lib::Shape::Shape(const Graph_lib::Shape &)': function was explicitly deleted

Сборка не удалась.

29.10.2017

  • Как заметил Фред Ларсон, сообщение об ошибке говорит само за себя. Вам нужно прочитать документацию по Graph_lib, чтобы понять, почему Rectangle нельзя копировать (т.е. имеет удаленный конструктор копирования). 29.10.2017
  • Итак, как я могу исправить этот код? Я имею в виду, как распечатать серию прямоугольников? Если вектор не работает. 29.10.2017
  • В любом случае, большое спасибо! 29.10.2017
  • Другой вопрос. Я добавляю win.attach(r);win.wait_for_button(); в цикле, но прямоугольники просто отображаются один за другим, и в конце ничего не появляется. Я не знаю почему. Я просто хочу, чтобы все эти прямоугольники отображались вместе. 29.10.2017
  • for (int x = 0, y = 0; x ‹ x_size&&y ‹ y_size; x += x_grid, y += y_grid) { Graph_lib::Rectangle r(Graph_lib::Point(x, y), x_grid, y_grid); r.set_fill_color(Graph_lib::Color::red); win.attach(r); } 29.10.2017
  • Это должен быть новый вопрос. 29.10.2017
  • Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что вопрос сводится к тому, почему этот сторонний (нестандартный) некопируемый тип нельзя хранить в стандартном контейнере, который может хранить только копируемые объекты? ОП должен прочитать документацию для сторонней библиотеки, чтобы понять, почему этот тип не может быть скопирован, и найти альтернативы. Люди без доступа к сторонней библиотеке не могут этого сделать. Таким образом, этот вопрос не по теме форума C++. 29.10.2017

Ответы:


1

Похоже, что класс Graph_lib::Rectangle нельзя скопировать, потому что его конструктор копирования удален. Это предотвращает использование push_back() непосредственно в экземпляре. Возможно, вы сможете использовать std:move():

rect.push_back(std::move(r));

Возможно, класс тоже не перемещается. В этом случае вы можете использовать std::unique_ptr в векторе:

vector<std::unique_ptr<Graph_lib::Rectangle>> rect;

Это потребует от вас динамического размещения ваших объектов. Это можно сделать с помощью std::make_unique, если ваш компилятор поддерживает C++. 14 стандарт или более поздняя версия:

for (int x = 0, y = 0; x < x_size&&y < y_size; x += x_grid, y += y_grid)
{
    auto r = std::make_unique<Graph_lib::Rectangle>(Graph_lib::Point(x, y), x_grid, y_grid);
    r->set_fill_color(Graph_lib::Color::red);
    rect.push_back(std::move(r));
}

Если С++ 14 недоступен, вы можете выделить свои прямоугольники, используя new:

for (int x = 0, y = 0; x < x_size&&y < y_size; x += x_grid, y += y_grid)
{
    auto r = std::unique_ptr<Graph_lib::Rectangle>(new Graph_lib::Rectangle(Graph_lib::Point(x, y), x_grid, y_grid));
    r->set_fill_color(Graph_lib::Color::red);
    rect.push_back(std::move(r));
}
29.10.2017
  • хорошо, но он говорит, что у std нет члена 'unique_ptr'. 29.10.2017
  • Вам понадобится #include <memory>. 29.10.2017
  • во втором написано, что невозможно преобразовать из 'Graph_lib::Rectangle *' в 'std::unique_ptr‹Graph_lib::Rectangle,std::default_delete‹_Ty››' 29.10.2017
  • Это должно быть исправлено сейчас. 29.10.2017
  • он говорит, что :error C2280: 'std::unique_ptr‹Graph_lib::Rectangle,std::default_delete‹_Ty››::unique_ptr(const std::unique_ptr‹_Ty,std::default_delete‹_Ty›› &)': попытка сослаться на удаленную функцию 29.10.2017
  • Ах, моя ошибка. Вы должны std::move указать указатель на вектор. 29.10.2017
  • Извините, я не знаю, что вы имеете в виду, не могли бы вы показать мне. извините, я свежий человек. 29.10.2017
  • Смотрите мою правку. На самом деле, если Graph_lib::Rectangle подвижен, вам вообще не понадобится std::unique_ptr. 29.10.2017
  • Но обнаруживается другая проблема. Это про win.attach(rect[1]); в конце. ошибка C2664: «void Graph_lib::Window::attach(Graph_lib::Widget &)»: невозможно преобразовать аргумент 1 из «std::unique_ptr‹Graph_lib::Rectangle,std::default_delete‹_Ty››» в «Graph_lib: :Форма &' 29.10.2017
  • Теперь члены вашего вектора являются указателями. Поэтому вам нужно будет использовать -> вместо . и использовать унарный * для разыменования указателя в других местах, например win.attach(*rect[1]). 29.10.2017
  • вы имеете в виду win-›attach(rect[1]*); Сюда? 29.10.2017
  • Нет, именно так, как я сказал. win.attach(*rect[1]). Мы не делали win указателем, а просто членами вектора. поэтому rect[1] теперь является указателем. *rect[1] разыменовывает указатель. 29.10.2017
  • ДА! Теперь это работает! Большое спасибо! Кроме того, мое английское имя тоже Фред, классное имя, классные ребята. 29.10.2017
  • Рад, что помог. Лучшая благодарность на SO - это голосование и принятие ответа, который вам помог. 29.10.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..