我目前一直在尝试包装使用如下定义的 native C++ 接口(interface)的 native C++ API 的一部分:
#pragma once
class BufferReaderInterface
{
public:
virtual ~BufferReaderInterface()
{
}
const static int BUFFER_SIZE = 100;
virtual void ReadNextBuffer(char* buffer) = 0;
};
然后解析器类使用它来将数据读入它的本地缓冲区,以便以后像这样进行解析:
#pragma once
#include "BufferReaderInterface.h"
class BufferParser
{
public:
void ReadNextBuffer(BufferReaderInterface& reader)
{
reader.ReadNextBuffer(localBuffer);
}
void ParseBuffer()
{
// do buffer parsing after ReadNextBuffer()...
}
private:
char localBuffer[BufferReaderInterface::BUFFER_SIZE];
};
这是一个从文件流中读取缓冲区的示例实现(它不一定是文件流,也可以实现为从网络读取):
#pragma once
#include <fstream>
#include "BufferReaderInterface.h"
class FileStreamBufferReader : public BufferReaderInterface
{
public:
FileStreamBufferReader(std::string filename)
{
bufferFile.open(filename.c_str(),
std::ios_base::in | std::ios_base::binary);
if(!bufferFile)
{
throw std::invalid_argument(filename);
}
}
~FileStreamBufferReader()
{
bufferFile.close();
}
void ReadNextBuffer(char* buffer)
{
bufferFile.read((char *)buffer, BUFFER_SIZE);
}
private:
std::ifstream bufferFile;
};
一个简单的用法如下:
BufferReaderInterface* br = new FileStreamBufferReader("test.binary");
BufferParser parser;
parser.ReadNextBuffer(*br);
parser.ParseBuffer();
// use parsed data...
delete br;
我应该如何包装 BufferParser
类?我正在尝试在其上使用 Pimpl-idiom,但在正确实现 ReadNextBuffer(BufferReaderInterface&)
函数的托管版本时我遇到了困难。我已经尝试创建一个 public interface class ManagedBufferReaderInterface
,但后来我卡住了,因为 BufferParser
采用 native C++ 接口(interface),而 C++/CLI 类无法实现 native C++ 接口(interface),如 BufferReaderInterface
。有人遇到过这个吗?
如有任何建议,我们将不胜感激!
最佳答案
使用抽象类而不是接口(interface)怎么样?
public ref class ManagedBufferReaderInterface abstract
{
private public: // internal
BufferReaderInterface * native_interface;
public:
ManagedBufferReaderInterface(BufferReaderInterface * nativeinterface)
: native_interface(nativeinterface)
{ ... }
//...
};
public ref class ManagedBufferParser
{
BufferParser * parser;
public:
ManagedBufferParser()
: parser(new BufferParser())
{ ... }
void ReadNextBuffer(ManagedBufferReaderInterface ^ reader)
{
parser->ReadNextBuffer(reader->native_interface);
}
void ParseBuffer()
{
parser->ParseBuffer();
}
//...
};
添加代码:
#include <msclr\marshal_cppstd.h>
public ref class ManagedFileStreamBufferReader : public ManagedBufferReaderInterface
{
public:
ManagedFileStreamBufferReader(System::String ^ filename)
: ManagedBufferReaderInterface(new FileStreamBufferReader( msclr::interop::marshal_as<std::string>(filename) ) )
{ ... }
// ....
};
//Example
ManagedBufferReaderInterface ^ br = gcnew ManagedFileStreamBufferReader("test.binary");
ManagedBufferParser ^ parser = gcnew ManagedBufferParser();
parser->ReadNextBuffer(br);
parser->ParseBuffer();
关于c++ - 包装在 C++/CLI 中使用 native 接口(interface)的 native C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100045/