2017-11-03 2 views
-2

Ich verwende MFC Visual Studio 8 Version 9. Ich möchte ein Array oder Vektor von CPngImage-Objekten erstellen. Wenn ich das Array als global deklariere, ist es in Ordnung. Wenn ich versuche, das Array zu einer meiner eigenen Klassen in den folgenden Fehler hinzufügen:Array oder Vektor der CPngImage-Klasse kann nicht erstellt werden

afxwin.h (312): Fehler C2248: 'CObject :: CObject': kann nicht auf private Mitglied in Klasse 'CObject' deklariert Hier

ist ein Beispiel dafür, was ich zu tun versucht:

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

kann jemand erklären, warum ich das nicht tun kann?

+0

Es gibt keine CObject im Code ist. –

+2

Kann nicht reproduziert werden, bitte machen Sie einen [MCVE]. Ich habe soeben 'CPngImage pngImage [3]; 'zu einer meiner Klassen hinzugefügt und es kompiliert. –

+0

Zeige mindestens das Codefragment, in dem du' pngImage' verwendest. –

Antwort

0

CObject ist nicht mit Wert Semantik entworfen. Daher wird der Kopierkonstruktor von CObject als privat markiert. Daher ist das Deklarieren eines Arrays von CObject - oder eines Array von etwas, das von CObject wie CPngImage abgeleitet ist - nicht der richtige Weg.

Ändern Sie Ihr Array, um Zeiger zu halten, nicht ganze Objekte (d. H. CPngImage * anstelle von CPngImage). Sehen Sie, ob das hilft.

(Hast du auch einen Blick auf die Deklaration der Klasse vor, diese Frage zu stellen?)

+0

Ja, ich habe mir die Erklärung angesehen, bevor ich gefragt habe, ich habe sie einfach nicht verstanden. – BigEFrom84

+0

Ja, Entschuldigung, das war wahrscheinlich ein bisschen schnippisch von mir, das zu sagen. Der Grund, dass der Konstruktor und der Zuweisungsoperator privat sind, besteht darin, Sie ausdrücklich daran zu hindern, die Klasse so zu verwenden, dass Sie möglicherweise eine Instanz einer anderen zuweisen können. Dafür ist es nicht gemacht. Dies ist eine gängige C++ - Technik. Es ist die Art von Sache, die klar wird, wenn Sie mehr lernen. Kurz gesagt, alles, was von CObject abgeleitet wurde, sollte mit * pointer * und nicht mit * value * aufgerufen und gespeichert werden. Es ist genau so, wie es entworfen wurde. Tun Sie das und ich denke, Sie werden viel mehr Erfolg haben. – Joe

Verwandte Themen