无法访问在类"CObject"中声明的私有成员?
Cannot access private member declared in class '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.0vcatlmfcincludeafxtempl.h(1329): error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
1> c:program files (x86)microsoft visual studio 11.0vcatlmfcincludeafx.h(559) : see declaration of 'CObject::CObject'
1> c:program files (x86)microsoft visual studio 11.0vcatlmfcincludeafx.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> ]
void Add(EventData ev) {
this->aEvents.Add(ev);
}
这个必须是Add(EventData& ev)
。您的EventData
类没有非默认的复制构造函数或复制赋值操作符,并且具有不可复制的成员(CMap
)。这使得EventData
不可复制。所以你不能按值传递它因为那样会产生一个拷贝,而你不能这样做,因为这个类是不可复制的
CMap
有默认的copy-ctor。由于CMap
是由CObject
和CObject
的副本c-tor是私有的,你得到一个错误。
我没有使用CMap
和CArray
,而是使用std::map
和std::vector
,因为CString
与CMap
和CArray
不兼容。
相关文章:
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许