首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装使用C++/CLI中的本机接口的本机C++代码

包装使用C++/CLI中的本机接口的本机C++代码
EN

Stack Overflow用户
提问于 2012-02-02 01:08:19
回答 1查看 1.3K关注 0票数 0

我目前正试图包装使用原生C++接口的原生C++接口的一部分,如下所示:

代码语言:javascript
复制
#pragma once

class BufferReaderInterface
{
public:
    virtual ~BufferReaderInterface()
    {
    }

    const static int BUFFER_SIZE = 100;
    virtual void ReadNextBuffer(char* buffer) = 0;
};

然后由解析器类使用它将数据读取到它的本地缓冲区中,以便稍后进行解析,如下所示:

代码语言:javascript
复制
#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];
};

下面是一个从文件流中读取缓冲区的示例实现(它不必是一个文件流,也可以实现为从网络中读取):

代码语言:javascript
复制
#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;
};

一个简单的用法如下:

代码语言:javascript
复制
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类不能实现像BufferReaderInterface这样的本机C++接口,所以我遇到了麻烦。以前有没有人遇到过这种情况?

如有任何建议,我们将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-02 18:01:34

使用抽象类而不是接口怎么样?

代码语言:javascript
复制
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();
  }

//...
};

添加代码:

代码语言:javascript
复制
#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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9100045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档