我正在通过一些旧的C ++代码进行吐痰。 在其中,我声明了一个像这样的局部变量:
Pen blackPen(Color(255, 0, 0, 0));
这似乎调用了构造函数。
我试图让它成为一个全局变量,我想在函数中初始化它。但是,我无法以这种方式将变量从它的初始化中分割出来。当然,我可以定义一个全局变量
Pen blackPen;
但现在我不知道如何初始化它:
blackPen = Pen(Color(255, 0, 0, 0));
似乎最合理,但我收到错误:
“Gdiplus :: Pen :: Pen(const Gdiplus :: Pen&)”(在“c:\ Program Files(x86)\ Windows Kits \ 8.1 \ Include \ um \ gdipluspen.h”第452行声明) )无法进入
以下代码段显示了此行为:
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
Pen redPen;
int main(int argc, char *argv[])
{
Pen greenPen(Color(255, 0, 0, 0)); // this initialization works
redPen = Pen(Color(255, 0, 0, 0)); // but this doesn't...
return 0;
}
答案 0 :(得分:3)
我试图让它成为一个全局变量,我想在函数中初始化它。但是,我无法以这种方式将变量从它的初始化中分割出来。
一种选择是通过函数提供对变量的访问。
Pen& getBlackPen()
{
static Pen pen{Color{255, 0, 0, 0}};
return pen;
}
然后,您可以在函数声明可用的任何位置访问对象。它将在第一次调用函数时初始化。
更新,以回应OP的评论
另一个选项(提供Pen
符合std::map
的值类型的要求:
Pen& getPen(std::string const& name)
{
static std::map<std::string, Pen> pens =
{
{"black", Pen{Color{255, 0, 0, 0}} },
{"white", Pen{Color{...}} },
{"red", Pen{Color{...}} },
// etc.
};
}
return pens[name];
}
现在,您可以使用:
Pen& pen1 = getPen("black");
Pen& pen2 = getPen("red");
答案 1 :(得分:0)
我的解决方案是直接定义指针而不是Pen,然后使用从画笔起作用的构造函数:
#include <Windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
Brush *blackBrush;
Pen *blackPen;
int main(int argc, char *argv[])
{
blackBrush = new SolidBrush(Color(0, 0, 0));
blackPen = new Pen(blackBrush);
return 0;
}