|
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 Вот пример функции:
И обратно, при вызове функции таким способом: 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
|
||||||
| 13.06.2022, 22:34 | |
|
Ответы с готовыми решениями:
14
Возможно ли возвращение функцией двух значений? Именно возвращение, не ссылка или указатель Возвращение функцией объекта Возвращение массива функцией |
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||
| 13.06.2022, 23:21 | |||||||
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
|
|
|
фрилансер
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
|
|
|
фрилансер
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
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 14.06.2022, 13:11 | |||
|
2) надо не "как-то", а с пониманием дела. Сделайте массив указателей. Получить значение по указателю можно через его разыменование: *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
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
|
|||||||
| 14.06.2022, 13:58 | |||||||
|
лучше так
1
|
|||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 14.06.2022, 15:14 | |
|
1
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 14.06.2022, 15:53 | ||
|
Не по теме: Ну а то, что не реализовано копирование, то я хз, возможно это унификация с интерфейсом для других языков программирования или чтоб не злоупотребляли, можешь поизучать
2
|
||
|
0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
|
|
| 15.06.2022, 11:12 [ТС] | |
|
Непонятна логика создателей, предлагающих пользователям наборы инструментов, которыми невозможно нормально пользоваться напрямую и ради которых приходится прибегать к разным ухищрениям.
Вообще, чем больше знакомлюсь с С++, тем больше по сравнению с тем же Дельфийским Паскалем он напоминает инвалида на костылях, причем все костыли разного размера и формы, некоторые с колесиками, некоторые со свистками и встроенным электрочайником, с блютузом и колонками. Однако общее у них то, что все они почти не помогают этому инвалиду при ходьбе. Удивляюсь как на этом языке можно написать что-то вменяемое, чтобы оно работало без косяков, вылетов и неожиданных ошибок.
0
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,098
|
||
| 15.06.2022, 11:23 | ||
![]() перешёл на C++, считай, что детство кончилось, теперь всё по взрослому
2
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 15.06.2022, 12:02 | |||
|
Позже появилась первая стабильная ВинСистема NT(которая все же натащила разных свистелок и перделок из прошлих ОС (в плане идеологий) ). Вообщем к чему я это, MS тянет всю эту лабуду еще черт знает откуда. И писать толковые интерфейсы для своих АПИ они тоже никогда не умели. Взять тот же MFC, взять тот же WinForms, который они почему то не смогли/захотели адаптировать под нативный С++ код. В Делфи, эти и другие обертки там, написаны по другому или обертка над оберткой (что б плюшевым программистам было легко). В Делфи начинаются проблемы, когда вы хотите написать что то серьезное и эффективное. Тогда оказывается что их средства, кхм, почти ни на что не годятся. Еще с 7 Делфи помню, когда нужно нормально работать со сложной VCL компонентой, приходится половину ее переписать. Унаследовать и переписать/перекрыть убогие методы, добавить свои. Также помню были сложности с работами нуль-строками ...И теми же ВинАпи напрямую. С нынешней студией Embarcadero RAD (не знаю дышит ли она еще) работать с ее С++ фреймворком практически невозможно. Не говоря о том что они не следуют стандартам языка. И реактивные костыли пылить весело и легко. Когда знаешь что к чему. stalkself, при изучении С++ нужно терпение и последовательность. Его не получится как Дельфина с наскока оседлать
1
|
|||
| 15.06.2022, 12:02 | |
|
Помогаю со студенческими работами здесь
15
Возвращение функцией wchar_t значения. Возвращение нескольких значений функцией Ajax.Возвращение значения функцией Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
На первой гифке отладочные линии отключены, а на второй включены:. . .
|