2012-02-01 111 views
0

我目前卡住试图包装使用这样定义的本地C++接口本地C++ API的一部分:结束语本地C++代码++/CLI

#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需要一个本地C++接口,而C++/CLI类不能实现一个本地C++接口,如BufferReaderInterface。有没有人遇到过这个?

任何意见将不胜感激!

+0

我定义接口IDL文件,并使用COM的本地/管理过渡。 – 2012-02-02 10:22:40

回答

1

如何使用抽象类而不是接口?

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(); 
+0

那么,我是否需要在本地C++中实现特定读者的另一层,然后将这些读者传递给'ManagedBufferReaderInterface'? – mevatron 2012-02-02 16:09:39

+0

@mevatron:是的,确切的。还更新了答案。 – 2012-02-02 20:14:20

+0

谢谢!这是一个有用的例子! :) – mevatron 2012-02-03 14:12:36