C ++初始化为函数

时间:2017-02-17 19:58:56

标签: c++ class initialization

我正在通过一些旧的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;
}

2 个答案:

答案 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;
}