Не можете получить доступ к закрытому члену, объявленному в классе ‘CObject’?

class EventDataValue {
public:
enum Types {
NONE,
INT,
STRING,
DOUBLE,
ULONG
};

EventDataValue() { this->Type = NONE; }
EventDataValue( const EventDataValue &s ) {
this->Type = s.Type;

if (this->Type == INT)
this->i = s.i;
else if (this->Type == STRING)
this->s = s.s;
else if (this->Type == DOUBLE)
this->d = s.d;
else if (this->Type == ULONG)
this->ul = s.ul;
}

EventDataValue& operator=( const EventDataValue &s ) {
this->Type = s.Type;

if (this->Type == INT)
this->i = s.i;
else if (this->Type == STRING)
this->s = s.s;
else if (this->Type == DOUBLE)
this->d = s.d;
else if (this->Type == ULONG)
this->ul = s.ul;

return *this;
}EventDataValue(int value) {
this->Type = INT;
this->i = value;
}

EventDataValue(CString &value) {
this->Type = STRING;
this->s = value;
}

EventDataValue(LPCTSTR value) {
this->Type = STRING;
this->s = CString(value);
}

EventDataValue(double value) {
this->Type = DOUBLE;
this->d = value;
}

EventDataValue(unsigned long value) {
this->Type = ULONG;
this->ul = value;
}

~EventDataValue() { }

operator int(void) const {
return this->i;
}

operator CString(void) const {
return this->s;
}

operator double(void) const {
return this->d;
}

operator unsigned long(void) const {
return this->ul;
}Types Type;
int i;
CString s;
double d;
unsigned long ul;
};

class EventData {
public:
EventData(CString strEventCode, CString &strSessionId, int nFlowId = 0) {
this->Add(CString(_T("tp")), strEventCode);
this->Add(CString(_T("ss")), strSessionId);
this->Add(CString(_T("ts")), (int)std::time(0));

if (nFlowId != 0)
this->Add(CString(_T("fl")), nFlowId);
}

template <typename T>
void Add(CString name, T value) {
EventDataValue event_value(value);

if (cMap.Lookup(name, NULL) == TRUE)
return;

cMap[name] = value;
}

CMap<CString, CString, EventDataValue, EventDataValue> cMap;
};

class Events {
public:
Events() { }
~Events() { }

void Add(EventData ev) {
this->aEvents.Add(ev);
}

CStringW Serialize() {
CStringW strOutput;
INT_PTR i, j;

if (_tcscmp(API_FORMAT, FORMAT_JSON) == 0) {
for (i = 0; i != this->aEvents.GetCount(); i++) {
EventData ev = this->aEvents[i];

strOutput += L"{";

j = 0;

POSITION pos = ev.cMap.GetStartPosition();

while (pos != NULL) {
CString key;
EventDataValue value;

ev.cMap.GetNextAssoc( pos, key, value );

strOutput += StringFormat(_T("\"%s\": "), key.GetString());

if (value.Type == EventDataValue::STRING) {
CString str = value;
strOutput += Enquoute(str);
} else if (value.Type == EventDataValue::INT) {
int n = value;
strOutput += StringFormat(_T("%d"), n);
} else if (value.Type == EventDataValue::DOUBLE) {
double d = value;
strOutput += StringFormat(_T("%d"), static_cast<int>(d));
} else if (value.Type == EventDataValue::ULONG) {
ULONG ul = value;
strOutput += StringFormat(_T("%u"), ul);
}

if (j++ < ev.cMap.GetCount() - 1)
strOutput += _T(",");
}

strOutput += _T("}");
}
} else {
for (i = 0; i != this->aEvents.GetCount(); i++) {
EventData ev = this->aEvents[i];

strOutput += _T("<Event>");

j = 0;

POSITION pos = ev.cMap.GetStartPosition();

while (pos != NULL) {
CString key;
EventDataValue value;

ev.cMap.GetNextAssoc( pos, key, value );

strOutput += StringFormat(_T("<%s>"), key.GetString());

if (value.Type == EventDataValue::STRING) {
CString str = value;
strOutput += str;
} else if (value.Type == EventDataValue::INT) {
int n = value;
strOutput += StringFormat(_T("%d"), n);
} else if (value.Type == EventDataValue::DOUBLE) {
double d = value;
strOutput += StringFormat(_T("%d"), static_cast<int>(d));
} else if (value.Type == EventDataValue::ULONG) {
ULONG ul = value;
strOutput += StringFormat(_T("%u"), ul);
}

strOutput += StringFormat(_T("</%s>"), key.GetString());
}

strOutput += _T("</Event>");
}

}

return strOutput;
}

CArray<EventData> aEvents;
};

Может кто-нибудь сказать мне, почему я получаю следующую ошибку при попытке скомпилировать это?

1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1329): error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afx.h(559) : see declaration of 'CObject::CObject'
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afx.h(534) : see declaration of 'CObject'
1>          This diagnostic occurred in the compiler generated function 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CMap(const CMap<KEY,ARG_KEY,VALUE,ARG_VALUE> &)'
1>          with
1>          [
1>              KEY=CString,
1>              ARG_KEY=CString,
1>              VALUE=EventDataValue,
1>              ARG_VALUE=EventDataValue
1>          ]

0

Решение

void Add(EventData ev) {
this->aEvents.Add(ev);
}

это должен быть Add(EventData& ev), Ваш EventData класс не имеет конструктора копирования не по умолчанию или оператора назначения копирования и имеет член (CMap) это не для копирования. Это делает EventData без копируемого. Таким образом, вы не можете передать его по значению, потому что это должно было бы сделать копию, что вы не можете сделать, так как класс не подлежит копированию.

3

Другие решения

CMap имеет по умолчанию copy-ctor. поскольку CMap происходит от CObject а также CObjectКопия c-tor является частной, вы получаете ошибку.

2

Вместо того, чтобы использовать CMap а также CArray, Я использовал std::map а также std::vector поскольку CString не совместим с CMap а также CArray,

-1
По вопросам рекламы [email protected]