0 / 0 / 0
Регистрация: 04.11.2021
Сообщений: 12
1

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

13.06.2022, 22:34. Показов 704. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2022, 22:34
Ответы с готовыми решениями:

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

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

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

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

14
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
13.06.2022, 23:21 2
Цитата Сообщение от 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  [ТС] 3
Спасибо, компилятор скушал, а как теперь осуществить вызов этой функции?
Обычным присваиванием выдает ошибку:

[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
фрилансер
4167 / 3577 / 797
Регистрация: 11.10.2019
Сообщений: 9,613
14.06.2022, 09:33 4
stalkself, как-то так

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

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

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

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

function tform1.vertical(x1,x2,x3,x4:real):tgpgraphicspath;
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
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
14.06.2022, 13:11 8
Цитата Сообщение от stalkself Посмотреть сообщение
пытаюсь как-то это организовать в с++
1) зачем с++?
2) надо не "как-то", а с пониманием дела.
Цитата Сообщение от stalkself Посмотреть сообщение
мне в итоге нужно привести результат выполнения функции vertical к обычному типу Gdiplus::GraphicsPath
то есть по условиям задачи нужно получить массив готовых траекторий Gdiplus::GraphicsPath
Я еще раз повторю, т.к. объекты эти не копируемы, работайте с указателями.
Сделайте массив указателей.
Получить значение по указателю можно через его разыменование: *pointer и pointer->....


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

Объявление:
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
фрилансер
4167 / 3577 / 797
Регистрация: 11.10.2019
Сообщений: 9,613
14.06.2022, 13:58 10
Цитата Сообщение от stalkself Посмотреть сообщение
Остановился пока на таком варианте
плохой вариант - будут всякие грабли с утечками и вылетами из-за доступа по кривой памяти

лучше так
C++
1
std::unique_ptr<Gdiplus::GraphicsPath> vpath[31][31];
а вместо массива лучше std::array (если размер меняться не будет) или std::vector (если будет)
1
1330 / 962 / 338
Регистрация: 29.06.2020
Сообщений: 3,697
14.06.2022, 15:14 11
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я еще раз повторю, т.к. объекты эти не копируемы, работайте с указателями.
Ну они клонируемы, есть метод Clone, вопрос зачем.
1
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
14.06.2022, 15:53 12
Цитата Сообщение от SmallEvil Посмотреть сообщение
вопрос зачем
Эти классы просто обёртка над С интерфейсом(сами являются аналогом unique_ptr, хранят указатель на объект dll)

Не по теме:

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

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

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

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

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

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

stalkself, при изучении С++ нужно терпение и последовательность. Его не получится как Дельфина с наскока оседлать
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2022, 12:02
Помогаю со студенческими работами здесь

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

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

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

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

Возвращение функцией разных значений return
В одном случае надо вернуть значение retun fout; В другом return 0;. Вот такой пример. ...

Возвращение функцией массива (или указателя на массив)
Вопрос опытным. Имеется массив картинок TImage, который создается одной функцией. Как вызвать этот...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru