2012-12-24 68 views
0
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; 
}; 

有人可以告诉我为什么我在编译时遇到以下错误?无法访问类'CObject'中声明的私有成员?

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

什么是_T? ... –

+2

'CObject'不可复制,这意味着您需要通过参考传递并返回它,而不是通过值。这意味着您不能复制派生自的对象,或者包含派生自“CObject”的对象的对象。 –

回答

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

必须Add(EventData& ev)。您的EventData类没有非默认的拷贝构造函数或拷贝赋值操作符,并且有一个不可复制的成员(CMap)。这使得EventData不可复制。所以你不能通过价值来传递它,因为这将不得不复制,因为这个类是不可复制的,所以你不能这样做。

2

CMap具有默认的copy-ctor。由于CMap派生自CObjectCObject的复制c-tor是私人的,所以你会得到一个错误。

-1

而不是使用CMapCArray,我用std::mapstd::vector因为CString不与CMapCArray兼容。

+0

不真实。我在一些应用程序中广泛使用它。从我的代码中获取真实应用程序的示例:CMap MappedPoints'和'CArray Tags'。 – sergiol

相关问题