Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12

Возвращение функцией GraphicsPath (GDI+)

13.06.2022, 22:34. Показов 1023. Ответов 14

Студворк — интернет-сервис помощи студентам
Добрый день. Не обладаю сколь-либо значимым опытом в с++, поэтому столкнулся с такой проблемой.
Моя задача создать функцию, которая возвращала бы GraphicsPath, который как предполагается будет включать в себя различные линии, кривые и и.д.
Однако в процессе написания такой функции столкнулся с невозможностью передать в ее результат готовый GraphicsPath. Выдается ошибка:

[bcc32c Error] Unit1.cpp(60): calling a protected constructor of class 'Gdiplus::GraphicsPath'
GdiplusPath.h(875): declared protected here

Вот пример функции:

C++
1
2
3
4
5
6
Gdiplus::GraphicsPath __fastcall vertical(float x1,float x2,float x3,float x4)
{
Gdiplus::GraphicsPath pth;
pth.AddLine(x1,x2,x3,x4);
return pth;
}
суть такая, что хотел добавлять примитивы (линии, кривые) в путь pth и после передавать его как результат вызова функции.

И обратно, при вызове функции таким способом:

vpath[i][j]=vertical(ind[i][j].X,ind[i][j].Y,ind[i][j+1].X,ind[i][j+1].Y);

имея заранее объявленный массив GraphicsPath получаю ошибку

[bcc32c Error] Unit1.cpp(513): 'operator=' is a private member of 'Gdiplus::GraphicsPath'
GdiplusPath.h(883): declared private here

Подскажите новичку, как побороть сие.
В дельфи с этим проблем вообще никаких не возникало. Просто создаешь траекторию, рисуешь фигуры и передаешь результат.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2022, 22:34
Ответы с готовыми решениями:

Возможно ли возвращение функцией двух значений? Именно возвращение, не ссылка или указатель
Нужна функция в которую забиваешь два числа и сначала она возвращает минимальное, после максимальное. Я пробовал делать с ссылками и это не...

Возвращение функцией объекта
Здравствуйте. Это пример из книжки. #include <iostream> using namespace std; class MyClass { int val; public: MyClass(int...

Возвращение массива функцией
Здравствуйте вот пытаюсь освоить базовые знания по C#. Объясните пожалуйста как я могу сделать отправку массива в функцию , чтобы в функции...

14
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.06.2022, 23:21
Цитата Сообщение от stalkself Посмотреть сообщение
Подскажите новичку, как побороть сие.
Судя по всему, объекты данного класса некопируемы, так что, как вариант, работайте с указателями(желательно умными):
C++
1
2
3
4
5
6
7
// #include <memory>
std::unique_ptr<Gdiplus::GraphicsPath> __fastcall vertical(float x1,float x2,float x3,float x4)
{
std::unique_ptr<Gdiplus::GraphicsPath> pth(new Gdiplus::GraphicsPath);
pth->AddLine(x1,x2,x3,x4);
return pth;
}
1
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
14.06.2022, 07:34  [ТС]
Спасибо, компилятор скушал, а как теперь осуществить вызов этой функции?
Обычным присваиванием выдает ошибку:

[bcc32c Error] Unit1.cpp(521): no viable overloaded '='
GdiplusPath.h(883): candidate function not viable: no known conversion from 'std::unique_ptr<Gdiplus::GraphicsPath>' to 'const Gdiplus::GraphicsPath' for 1st argument
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
14.06.2022, 09:33
stalkself, как-то так

std::unique_ptr<const Gdiplus::GraphicsPath> path=vertical(....);
1
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
14.06.2022, 10:18  [ТС]
тогда выдает ошибку:
GdiplusPath.h(883): candidate function not viable: no known conversion from 'std::unique_ptr<Gdiplus::GraphicsPath>' to 'const Gdiplus::GraphicsPath' for 1st argument
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
14.06.2022, 10:29
stalkself, нужно код показывать. Вот пример - всё нормально https://onlinegdb.com/LPUVMDdtT
1
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
14.06.2022, 10:42  [ТС]
я наверно неправильно выразил мысль
мне в итоге нужно привести результат выполнения функции vertical к обычному типу Gdiplus::GraphicsPath
то есть по условиям задачи нужно получить массив готовых траекторий Gdiplus::GraphicsPath, с которыми можно будет работать на свое усмотрение (конкретно собираюсь собирать из них различные фигуры, подставляя элементы массива в требуемом порядке) с последующим преобразованием в регионы

у меня есть рабочий вариант в Дельфи, который я пытаюсь перевести на С++
там все это выглядит элементарно и работает без каких-либо ухищрений:

вот объявленная переменная:
vpath,gpath:array of array of tgpgraphicspath; //Массив траекторий

вот функция vertical:

function tform1.vertical(x1,x2,x3,x4:real):tgpgra phicspath;
begin
result:=tgpgraphicspath.Create();
result.AddLine(x1,x2,x3,x4)
end;

вот обращение к ней:

for j:= 0 to koly-1 do
for i:= 0 to kolx do
begin
vpath[i,j]:=vertical(ind[i,j].X,ind[i,j].Y,ind[i,j+1].x,ind[i,j+1].Y);
end;

элементарно, просто, и без ухищрений

пытаюсь как-то это организовать в с++, получается полная ерунда.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.06.2022, 13:11
Цитата Сообщение от stalkself Посмотреть сообщение
пытаюсь как-то это организовать в с++
1) зачем с++?
2) надо не "как-то", а с пониманием дела.
Цитата Сообщение от stalkself Посмотреть сообщение
мне в итоге нужно привести результат выполнения функции vertical к обычному типу Gdiplus::GraphicsPath
то есть по условиям задачи нужно получить массив готовых траекторий Gdiplus::GraphicsPath
Я еще раз повторю, т.к. объекты эти не копируемы, работайте с указателями.
Сделайте массив указателей.
Получить значение по указателю можно через его разыменование: *pointer и pointer->....


Если вам принципиально нужен массив объектов, а не указателей и вы не планируете "копировать" эти объекты, то передавайте эти объекты в функции по ссылке и там изменяйте.
2
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
14.06.2022, 13:38  [ТС]
Всем спасибо за помощь.
Остановился пока на таком варианте:

Объявление:
Gdiplus::GraphicsPath* vpath[31][31];

Функция:
Gdiplus::GraphicsPath* vertical(float x1,float x2,float x3,float x4)
{
Gdiplus::GraphicsPath* pth = new Gdiplus::GraphicsPath;
pth->AddLine(x1,x2,x3,x4);
return pth;
}

Вызов:
vpath[i][j]=vertical(ind[i][j].X,ind[i][j].Y,ind[i][j+1].X,ind[i][j+1].Y);

Так вроде работают функции траекторий навроде AddPath, Reverse и т.д.
Хотя все равно нифига не понял, в чем смысл этого кода.
Такое ощущение, что любовь с языком С++ явно не сложится.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
14.06.2022, 13:58
Цитата Сообщение от stalkself Посмотреть сообщение
Остановился пока на таком варианте
плохой вариант - будут всякие грабли с утечками и вылетами из-за доступа по кривой памяти

лучше так
C++
1
std::unique_ptr<Gdiplus::GraphicsPath> vpath[31][31];
а вместо массива лучше std::array (если размер меняться не будет) или std::vector (если будет)
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.06.2022, 15:14
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я еще раз повторю, т.к. объекты эти не копируемы, работайте с указателями.
Ну они клонируемы, есть метод Clone, вопрос зачем.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
14.06.2022, 15:53
Цитата Сообщение от SmallEvil Посмотреть сообщение
вопрос зачем
Эти классы просто обёртка над С интерфейсом(сами являются аналогом unique_ptr, хранят указатель на объект dll)

Не по теме:

Ну а то, что не реализовано копирование, то я хз, возможно это унификация с интерфейсом для других языков программирования или чтоб не злоупотребляли, можешь поизучать

2
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
15.06.2022, 11:12  [ТС]
Непонятна логика создателей, предлагающих пользователям наборы инструментов, которыми невозможно нормально пользоваться напрямую и ради которых приходится прибегать к разным ухищрениям.
Вообще, чем больше знакомлюсь с С++, тем больше по сравнению с тем же Дельфийским Паскалем он напоминает инвалида на костылях, причем все костыли разного размера и формы, некоторые с колесиками, некоторые со свистками и встроенным электрочайником, с блютузом и колонками. Однако общее у них то, что все они почти не помогают этому инвалиду при ходьбе. Удивляюсь как на этом языке можно написать что-то вменяемое, чтобы оно работало без косяков, вылетов и неожиданных ошибок.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
15.06.2022, 11:23
Цитата Сообщение от stalkself Посмотреть сообщение
Удивляюсь как на этом языке можно написать что-то вменяемое, чтобы оно работало без косяков, вылетов и неожиданных ошибок.
практика, опыт

перешёл на C++, считай, что детство кончилось, теперь всё по взрослому
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
15.06.2022, 12:02
Цитата Сообщение от stalkself Посмотреть сообщение
Вообще, чем больше знакомлюсь с С++, тем больше по сравнению с тем же Дельфийским Паскалем он напоминает инвалида
Это далеко не проблема C++. Сложности работы с WinApi лежат корнями к ДОСу. Когда первый Виндовс() был на досовской основе.
Позже появилась первая стабильная ВинСистема NT(которая все же натащила разных свистелок и перделок из прошлих ОС (в плане идеологий) ). Вообщем к чему я это, MS тянет всю эту лабуду еще черт знает откуда.
И писать толковые интерфейсы для своих АПИ они тоже никогда не умели. Взять тот же MFC, взять тот же WinForms, который они почему то не смогли/захотели адаптировать под нативный С++ код.

В Делфи, эти и другие обертки там, написаны по другому или обертка над оберткой (что б плюшевым программистам было легко).
В Делфи начинаются проблемы, когда вы хотите написать что то серьезное и эффективное.
Тогда оказывается что их средства, кхм, почти ни на что не годятся.
Еще с 7 Делфи помню, когда нужно нормально работать со сложной VCL компонентой, приходится половину ее переписать.
Унаследовать и переписать/перекрыть убогие методы, добавить свои.
Также помню были сложности с работами нуль-строками ...И теми же ВинАпи напрямую.

С нынешней студией Embarcadero RAD (не знаю дышит ли она еще) работать с ее С++ фреймворком практически невозможно. Не говоря о том что они не следуют стандартам языка.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
перешёл на C++, считай, что детство кончилось
Однозначно.
И реактивные костыли пылить весело и легко. Когда знаешь что к чему.

stalkself, при изучении С++ нужно терпение и последовательность. Его не получится как Дельфина с наскока оседлать
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2022, 12:02
Помогаю со студенческими работами здесь

Возвращение функцией множества
Всем привет, есть программа написанная на паскальабс и прекрасно там работающая. Но при переносе ее в турбо паскаль, множество set...

Очистка формы функцией библиотеки GDI+
Экспериментирую с кодом: Form1.Cls GdipDrawImageRect graphics, img, 0, 0, nWidth, nHeight ...

Возвращение функцией wchar_t значения.
Такой вопросик. Нижеследующий код - это концепция. в качестве аргумента функции должна быть переменная типа wchar_t, функция...

Возвращение нескольких значений функцией
Есть функция, вызывается следующим образом ...

Ajax.Возвращение значения функцией
Добрый день! Проблема в следующем: есть js скрипт function js(country) { $.ajax({ url:'q.php' ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru