我在dll中有一个C ++类。
在该类中,我想将Curl回调中的数据存储到成员变量中。 我打算像这样使用字符串流:
void MyClass::CurlCallback( void * pvData, size_t tSize )
{
const char* data = static_cast<const char*>(pvData);
m_myStringStream << sata;
}
但是在我的班级中声明stringstream时是这样的:
private:
std::stringstream m_myStringStream;
我收到以下错误:
Error 1 error C2220: warning treated as error - no 'object' file generated
Warning 2 warning C4251: 'MyClass::MyClass::m_myStringStream' : class 'std::basic_stringstream<_Elem,_Traits,_Alloc>' needs to have dll-interface to be used by clients of class 'MyClass::MyClass'
如何在不收到此错误的情况下声明此字符串流?
我认为这是因为stringstream是一个C ++变量,但是dll期待c样式变量。
我调查过可能会创建一个存储xml数据的类,如下所示:
class XMLData
{
public:
XMLData();
virtual ~ XMLData();
const char* GetXMLData() const { return xml; }
void Append( const char* xmlData ) { /*add xmlData to xml blah blah*/};
private:
//Add more here - to do
char* xml;
int length;
};
并宣布:
XMLData* m_xmlData;
这样做的最佳方式是什么?
答案 0 :(得分:1)
首先,您收到警告,您选择威胁所有警告,例如项目设置中的错误。
DLL导出的类不应在其导出的接口中声明复杂类型(如STL模板),因为它将DLL使用限制为完全相同的编译器版本。这就是你收到警告的原因。
要解决此问题,您应该只导出一个接口类(即纯抽象类)并返回接口的实现。
像这样://in the interface:
class DLL_API IMyClass
{
public:
virtual void set(const char* data)=0;
virtual const char* get()=0;
}
//now not in the interface:
class CMyClass : public IMyClass
{
private:
std::stringstream mystream;
public:
virtual void set(const char* data){
mystream<<data;
}
virtual const char* get(){
return mystream.str().c_str();
}
}
你只使用DLL外的引用或指针,如果你需要在可执行文件中创建对象,你需要在DLL中使用工厂方法,因为它只知道接口。
IMyClass* ObjectFactory::GetMyClass()
{
return new CMyClass();
}