c ++ Почему я не могу передать типы CDC и CBitmap в параметры другого класса? - PullRequest
1 голос
/ 30 ноября 2011

Я пытаюсь настроить параметр из одного класса в другой. Но для типов CDC и CBitmap, это не позволит мне ??

dcMem и m_bmp являются переменными экземпляра или параметрами в классе

(также обратите внимание, что я использую vc ++ 6.0)

error C2582: 'CDC' : 'operator =' function is unavailable
error C2582: 'CBitmap' : 'operator =' function is unavailable

.

Image::Set_dcMem(CDC _dcMem)
{
    dcMem = _dcMem;
}

.

Image::Set_m_bmp(CBitmap _m_bmp)    
{
    m_bmp = _m_bmp;
}

Я также пытался просто установить параметры как таковые из другого класса, но получил те же ошибки, перечисленные выше:

Image *pImage = new Image;
pImage->dcMem = dcMem;
pImage->m_bmp = m_bmp;

Я нашел эту ссылку, но не уверен, как подать заявку:

http://msdn.microsoft.com/en-us/library/ccb3dh5c%28v=vs.80%29.aspx

http://msdn.microsoft.com/en-us/library/aa983787%28v=vs.71%29.aspx

с коррекцией снизу:

CDC* dcMem;
CBitmap *m_bmp;

Image *pImage = new Image;
pImage->dcMem = &dcMem;
pImage->m_bmp = &m_bmp;

Ответы [ 4 ]

2 голосов
/ 30 ноября 2011

Когда вы присваиваете объект, используя =, объект копируется, переменная слева уже создана, поэтому она должна каким-то образом получить копию состояния объекта справа от присвоения.

Но иногда трудно скопировать объект.В некоторых случаях это происходит из-за того, что некоторые внутренние элементы данных объекта не могут быть скопированы, или из-за того, что их копирование затруднено или занимает много времени.

В любом случае, когда автор класса решает, что копии не будут работать для этого класса, он / она отменяет определение метода operator=, чтобы пользователи класса никогда не пытались назначить объекты этого класса.учебный класс.См. этот вопрос для получения дополнительной информации по этому вопросу.

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

class Image {
    CDC* dcMem; // <-- declare member variable as a reference
};

Image::Set_dcMem(CDC& _dcMem) // <-- pass references instead of objects
{
    dcMem = &_dcMem; // <-- you can assign references just fine
}
1 голос
/ 30 ноября 2011

Вы можете сделать это с реализацией WTL для оболочки над объектами GDI, потому что это тонкие оболочки.В MFC, однако, оболочки не совсем «тонкие», и в дополнение к дескрипторам объектов GDI они включают в себя личные данные и не дублируются.

Хотя вы можете использовать ссылки:

Image::Set_dcMem(CDC& _dcMem)
{
  // ...
}
0 голосов
/ 30 ноября 2011

Вы не можете копировать CDC или CBitmap. Если вы посмотрите на файлы заголовков, вы увидите, что CBitmap происходит от CGdiObject, который происходит от CObject. CObject объявляет, что private operator = (), CGdiObject и CBitmap не объявляют operator = (), поэтому компилятор принимает CObject :: operator = (), и поскольку он является закрытым, вы не можете скопировать CBitmap. (То же самое относится к CDC, но с другими базовыми классами.)

Вы должны изменить свой класс Image для хранения ссылки или указателя на CDC / CBitmap. Я предпочел бы сохранить ссылку, если вы можете передать CDC / CBitmap в ctor Image и если CDC / CBitmap не изменяется в течение времени жизни Image. Я буду придерживаться сохранения указателя, если вам нужно установить или изменить CDC / CBitmap позже при жизни Image.

0 голосов
/ 30 ноября 2011

Если CDC или CBitmap имеют элементы справочных данных, члены-константы данных, закрытый / защищенный оператор = или наследуют от таких классов, то вы не можете применить operator=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...