2017-02-17 9 views
0

Я плюю через какой-то старый код на C++. В ней я объявить локальную переменную как это:Инициализация C++ как функция

Pen blackPen(Color(255, 0, 0, 0)); 

Это, кажется, вызвать конструктор.

Я пытаюсь сделать это глобальной переменной, которую хочу инициализировать в функции. Тем не менее, я не могу разделить переменную от ее инициализации таким образом. Конечно, я могу определить глобальную переменную,

Pen blackPen; 

Но теперь я не знаю, как инициализировать его:

blackPen = Pen(Color(255, 0, 0, 0)); 

кажется наиболее разумным, но я получаю сообщение об ошибке:

"Gdiplus::Pen::Pen(const Gdiplus::Pen &)" (declared at line 452 of "c:\Program Files (x86)\Windows Kits\8.1\Include\um\gdipluspen.h") is inaccessible

Следующий фрагмент показывает такое поведение:

#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; 
} 
+1

Кажется, что ваш конструктор копирования является закрытым. Можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve)? – emlai

+0

Похоже, вы не можете. Ошибка говорит о том, что конструктор копирования является закрытым. Он может быть подвижным, вы включили C++ 11? – NathanOliver

+0

Предоставьте [MCVE], пожалуйста. –

ответ

3

I am trying to make this a global variable, which I want to initialize in a function. However, I am not able to split the variable from it's initialization in this way.

Один из вариантов - предоставить доступ к переменной через функцию.

Pen& getBlackPen() 
{ 
    static Pen pen{Color{255, 0, 0, 0}}; 
    return pen; 
} 

Тогда у вас будет доступ к объекту в любом месте, где доступно объявление функции. Он будет инициализирован, когда функция будет вызвана в первый раз.

Update, в ответ на комментарий 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"); 
+0

Это работает (так что у вас есть мой upvote), но я не считаю его элегантным: я не хочу определять функцию для каждой Pen. Я жду, если появится более элегантное решение (иначе я приму свой ответ). – Ruben

+0

Обновление: при вызове GdiShutdown это попытается уничтожить Pen, и это приведет к ошибке нарушения доступа. Таким образом, он не полностью работает по назначению. – Ruben

+1

@Ruben, вы поднимаете действительные баллы, но я не за тем, что ваш исходный пост поднял как проблему. Надеюсь, вы сможете взять идеи из ответа и адаптировать их для решения всех других проблем, которые вы видите в своей программе. –

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

 Смежные вопросы

  • Нет связанных вопросов^_^