错误 C2248:“CObject::CObject”:当我在 MFC 中调用 hDC.SelectObject 函数时,无法访问在“CObject”类中声明的私有成员

Posted

技术标签:

【中文标题】错误 C2248:“CObject::CObject”:当我在 MFC 中调用 hDC.SelectObject 函数时,无法访问在“CObject”类中声明的私有成员【英文标题】:error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject' when I calling hDC.SelectObject function in MFC 【发布时间】:2021-03-08 07:30:07 【问题描述】:

我在 MFC (Visual Studio 2013) 中为 WinCE 2013 开发了一个简单的程序,使用 GDI 方法在设备上下文上绘图。 不幸的是,当我尝试在上下文设备句柄上调用 SelectObject 时出现错误: “错误 C2248:‘CObject::CObject’:无法访问在类‘CObject’中声明的私有成员”

我附加了一个调用 SelectObject 方法的函数。

    BOOL Druk::DrawGrid(CDC hDC,int start_x, int start_y, int limit_x, int limit_y, int width)

    CPen pen;
    COLORREF linecol;
    pen.CreatePen(PS_SOLID, width, NULL);
    hDC.SelectObject(&pen);
    for (float i = start_y; i < limit_y; i += 5 * MILIMETER)
    
        hDC.MoveTo(start_x, i);
        hDC.LineTo(limit_x, i);
    
    for (float j = start_x; j < limit_x; j += 5 * MILIMETER)
    
        hDC.MoveTo(j, start_y);
        hDC.LineTo(j, limit_y);

    
    for (float i = start_x; i < limit_x; i += MILIMETER)
    
        for (float j = start_y; j < limit_y; j += MILIMETER)
        
            hDC.MoveTo(i, j);
            hDC.LineTo(i + 1, j);
        
    

    return TRUE;

我尝试用谷歌搜索这个错误,但我找不到可以帮助我的东西。

【问题讨论】:

我认为您的问题在其他地方,因为我成功编译了您的代码,没有任何错误。 SelectObject 不会产生此错误。请发布完整的、未删节的错误诊断信息。 【参考方案1】:

您的 SelectObject() 代码对我来说看起来不错。但是,按值传递 CDC 是一个很大的错误。您应该通过引用传递它或传递一个指向 CDC 的指针。我希望当参数 CDC hDC 尝试制作副本时可能会看到错误。 CObject 的复制构造函数和赋值运算符被声明为私有且未实现。您不能复制它们。相反,将函数的签名更改为:

BOOL Druk::DrawGrid(CDC& hDC,int start_x, int start_y, int limit_x, int limit_y, int width)

// your code

你还有一些其他的问题……你需要保存最初选择的笔,然后在最后将它选择回CDC中……

CPen* pOldPen = hdc.SelectObject(&pen);

最后

hdc.SelectObject(pOldPen);

【讨论】:

几年前,我发布了this answer,提供了 MFC 采用这种方式设计的理由。 此外,hDC 也是非常糟糕的参数名称。我以为是HANDLE 类型。

以上是关于错误 C2248:“CObject::CObject”:当我在 MFC 中调用 hDC.SelectObject 函数时,无法访问在“CObject”类中声明的私有成员的主要内容,如果未能解决你的问题,请参考以下文章

错误:C2248:“QVariant::QVariant”:无法访问在“QVariant”类中声明的私有成员

命名空间内的错误 c2248 朋友类

“错误C2248:'CObject :: CObject':无法访问在类'CObject'中声明的私有成员[重复]

错误 C2248:“klientPracownik::klientPracownik”:无法访问在“klientPracownik”类中声明的私有成员

带有 std::thread 的 MVSE12 中的错误 C2248

qt 环境下mapx组件打包后编译产生c2248和c2512错误