【问题标题】:Cannot create array or vector of CPngImage class无法创建 CPngImage 类的数组或向量
【发布时间】:2018-04-16 07:26:05
【问题描述】:

我正在使用 MFC Visual Studio 8 版本 9。我想创建一个 CPngImage 对象的数组或向量。如果我声明数组是全局的,那很好。如果我尝试将数组添加到我自己的一个类中,则会出现以下错误:

afxwin.h(312) : 错误 C2248: 'CObject::CObject' : 无法访问在类 'CObject' 中声明的私有成员

这是我正在尝试做的一个例子:

#pragma once
#include <list>
#include <vector>
#include <iterator>
#include <afxtoolbarimages.h>
#include <afxwin.h>

using namespace std;
#define MAX_IMAGES 30

class PayAppReport
{
private:

CString m_projectName;
CString m_address;
CString m_city;
CString m_county;
CString m_GCcontact;
CString m_weather;
vector<CString> m_contractorsOnSite;
vector<CString> m_workInPlace;
vector<CString> m_workProjected;
vector<CString> m_issues;
vector<CString> m_report;

CPngImage pngImage[MAX_IMAGES];

float m_amount;

int m_payapp,zipCode,currentLine;

COleDateTime m_start,m_stop,m_observation;

bool m_OnSchedule;

CRect printRect;

public:
    vector<CString> m_pictures;
    PayAppReport(void);
    ~PayAppReport(void);
    void Clear();
    void SetProjectName(CString name);
    CString GetProjectName();
    void SetAddress(CString name);
    CString GetAddress();
    void SetCity(CString name);
    CString GetCity();
    void SetCounty(CString name);
    void SetCounty(int zipCode);
    CString GetCounty();
    void SetGCcontact(CString name);
    CString GetGCcontact();
    void SetAmount(float dollars);
    float GetAmountFloat();
    CString GetAmountString();
    void SetPayAppNumber(int num);
    int GetPayAppNumber();
    void SetZipCode(int code);
    int GetZipCode();
    void SetOnSchedule(bool ans);
    bool OnSchedule();
    void SetStartDate(COleDateTime date);
    void SetCompletionDate(COleDateTime date);
    void SetObservationDate(COleDateTime date);
    COleDateTime GetStartDate();
    COleDateTime GetCompletionDate();
    COleDateTime GetObservationDate();
    void AddContractorsOnSite(CString name);
    void AddWorkInPlace(CString name);
    void AddWorkProjected(CString name);
    void AddIssues(CString name);
    void AddPictures(CString name);
    int GetNumberOfContractorsOnSite();
    int GetNumberOfWorkInPlace();
    int GetNumberOfWorkProjected();
    int GetNumberOfIssues();
    int GetNumberOfPictures();
    CString GetContractorsOnSite(int num);
    CString GetContractorsOnSite();
    CString GetWorkInPlace(int num);
    CString GetWorkProjected(int num);
    CString GetIssues(int num);
    CString GetWorkInPlace();
    CString GetWorkProjected();
    CString GetIssues();
    CString GetPictures(int num);
    void SetWeather(CString name);
    CString GetWeather();
    CString PutList(vector<CString> theList);
    void InitializeContractorsOnSite();
    void InitializeWorkInPlace();
    void InitializeWorkProjected();
    void InitializeIssues();
    void InitializePictures();
    void PutLine(CString rightText, CString leftText, CDC *pDC, HDC hDC, bool indent, int height);
    CString toCurrency(float val);
};

谁能解释为什么我不能这样做?

【问题讨论】:

  • 您的代码中没有 CObject。
  • 无法复制,请发minimal reproducible example。我刚刚将CPngImage pngImage[3]; 添加到我的一个类中,它编译得很好
  • 至少显示你使用pngImage的代码片段。
  • @manni66 CObjectCPngImage 的祖父母。 afxwin.h 是 Microsoft 包含文件。
  • 添加类的原型和变量没有帮助,它们与问题无关,只会增加不必要的混乱。如果错误消息还有更多内容,that 会有所帮助。

标签: c++ arrays mfc cimage


【解决方案1】:

CObject 不是用值语义设计的。因此 CObject 的复制构造函数被标记为私有的。因此,声明一个 CObject 数组——或者一个从 CObject 派生的东西的数组,比如 CPngImage——不是要走的路。

更改您的数组以保存指针,而不是整个对象(即 CPngImage* 而不是 CPngImage)。看看有没有帮助。

(在问这个问题之前你有没有看过类的声明?)

【讨论】:

  • 是的,我在问之前确实看过声明,只是不明白。
  • 是的,抱歉,我这么说可能有点刻薄。基本上,构造函数和赋值运算符是私有的原因是专门防止您以可能导致您将一个实例分配给另一个实例的方式使用该类。它不是为此而生的。这是一种常见的 C++ 技术。随着您了解更多,这种事情会变得很清楚。简而言之,任何从 CObject 派生的东西都应该通过 pointer 而不是 value 访问和存储。这就是它的设计方式。这样做,我认为你会取得更大的成功。
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 2015-11-14
相关资源
最近更新 更多