C++ GDI+ 图像类:如何访问类“Gdipus::Image”中声明的私有成员 C2248

问题描述 投票:0回答:3

我试图读取我的 PNG 图像文件以从中创建一个精灵。我使用这段代码来阅读和绘制图像:

wchar_t filename = L'bunny.png';
wchar_t* path2 = &filename;

Image image = Image(path2, false);

Image* pImage = ℑ

Graphics graphics(pImage);

graphics.DrawImage(pImage, 10, 60);

但是编译器告诉我:

错误 C2248。 'Gdiplus::Image::Image':无法访问类'Gdiplus::Image'中声明的私有成员

我尝试使用 Image 类的公共部分的构造函数,但它被认为是私有部分的构造函数。

Image image = Image(IN path2, false);

有人可以告诉我一段可以在这种情况下工作的代码吗?

c++ image gdi+
3个回答
2
投票

看起来重载决议正在接管这里,因为您没有向构造函数提供正确的类型。值得注意的是

false
不是
BOOL
类型。它是
bool
类型。你应该用过
FALSE
.

虽然

BOOL
是整数类型,并且
bool
可以隐式转换为
int
,但这可能足以混淆编译器。重载解析系统甚至可以在尝试转换
bool
.

之前优先选择具有更好匹配签名的私有构造函数

你真正想要的构造函数是:

Image(
    IN const WCHAR* filename,
    IN BOOL useEmbeddedColorManagement = FALSE
);

因此您可以简单地执行此操作(注意第二个参数已经默认为 FALSE):

Image image(L"bunny.png");

如果你想把路径存储在一个变量中,评论区已经指出你做错了。您尝试使用多值字符文字,然后将其视为以 NUL 结尾的字符串。这是非常不正确的。

相反,使用

const WCHAR*
或简称
LPCWSTR

LPCWSTR path = L"bunny.png";
Image image(path);

0
投票

您遇到的错误是由于 Gdiplus::Image 类构造函数的使用不正确造成的。构造函数需要一个指向

const WCHAR
的指针作为第一个参数,但是您提供了一个指向单个
wchar_t
的指针。此外,构造函数中没有第二个参数。

这里是更正后的代码:

#include <Windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

int main() {
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    const WCHAR* filename = L"bunny.png"; // use a const WCHAR pointer

    Image image(filename); // no second parameter

    // Continue with the rest of your drawing code

    GdiplusShutdown(gdiplusToken);
    return 0;
}

注意在使用Gdiplus前要先初始化,用完后关闭。


0
投票

错误是因为你正在创建一个临时的

Image
并复制到另一个
Image
,但是复制构造函数是私有的。

您必须使用 C++17 之前的编译器,因为 C++17 及更高版本会为您消除临时文件。所以,你将不得不自己摆脱它,即改变这个:

Image image = Image(path2, false);

改为:

Image image(path2, false);
// or: Image image(path2);

此外,您的

filename
path
变量设置错误。他们应该更像这样:

const wchar_t* filename = L"bunny.png";
wchar_t* path2 = filename;

最后,你不需要那么多冗余的局部变量来开始:

Image image(L"bunny.png");
Graphics graphics(&image);
graphics.DrawImage(&image, 10, 60);

话虽这么说,你为什么要把 PNG 画到自己身上?

© www.soinside.com 2019 - 2024. All rights reserved.