非托管类的成员不能具有ref类类型或接口类类型

时间:2017-03-29 16:40:51

标签: c++ sqlite command-line-interface

我正在尝试将gui实现为一个小型的c ++项目,现在我正在尝试在c ++ / cli中使用我的非托管c ++代码来使用Windows窗体。转换后我不能使用正常的sqlite所以我试图移动到托管sqlite版本,我得到错误代码: “尝试在类成员中包含SQLiteConnection时,”非托管类的成员不能具有ref类类型或接口类类型。

#pragma once
#include <list>
#include "CAlbum.h"
#include "CUser.h"
#include "CDataAccess.h"
using namespace System::Data::SQLite;


class CDatabaseAccess : public CDataAccess
{
private:
    albums _albums;
    users _users;
    SQLiteConnection _sqldb;
    int _lastId;
    CPicture _topTaggedPicture;

    albums _albumsOfUser;
    pictures _picturesOfUser;

    bool fileExistsOnDisk(const string& filename);
    bool initDatabase();

public:
    CDatabaseAccess();
    ~CDatabaseAccess();

    bool open() override;
    void close() override;
    void clear() override;

    // album related
    const albums& getAlbums() override;
    const albums& getAlbumsOfUser(int userId) override;
    void insertAlbum(CAlbum& album) override;
    void deleteAlbum(string albumName) override;
    bool albumExists(string albumName) override;
    CAlbum* openAlbum(string albumName) override;
    void closeAlbum(CAlbum *pAlbum) override;

    // picture related
    void addPictureToAlbum(int albumId, CPicture& picture) override;
    void removePictureFromAlbum(int albumId, int pictureId) override;
    void tagUserInPicture(CPicture& picture, int userId) override;
    void untagUserInPicture(CPicture& picture, int userId) override;
    bool isUserTaggedInPicture(const CPicture& picture, int userId) override;

    // user related
    const users& getUsers() override;
    void addUser(CUser& user) override;
    void deleteUser(string userName) override;
    bool userExists(string userName) override;
    bool userExists(int userId) override;
    CUser* getUser(int userId) override;

    // user statistics
    int countAlbumsOwnedOfUser(int userId) override;
    int countAlbumsTaggedOfUser(int userId) override;
    int countTagsOfUser(int userId) override;
    float averageTagsPerAlbumOfUser(int userId) override;

    // queries
    const CUser* getTopTaggedUser() override;
    const CPicture* getTopTaggedPicture() override;
    const pictures& getTaggedPicturesOfUser(int userId) override;

    // sql related
    void setLastId(char* lastId);
    void resetLastId();
};

1 个答案:

答案 0 :(得分:1)

我不知道从本机c ++代码访问(而不是创建)托管对象的任何合理方法。

但这不是重点。你说你有一个c ++程序,你只想要一个c ++ / CLI(.Net)GUI。正如@AlgirdasPreidžius所说,你需要决定在哪里放置功能:在本机代码或托管代码中,但不能混合使用。

在您的情况下,您需要明确什么是核心代码和什么GUI,并尽量不混合。 核心必须与GUI无关(不使用!)。 GUI必须以非常控制的形式访问核心。在这种情况下,只需将指向您的核心中的本机类的指针插入到托管的clases中即可。它“只是有效”。您必须确定SQLite是属于核心还是属于GUI。我在这里看到的唯一技巧是在GUI和核心中以不同方式访问数据库:使用GUI中使用的System::Data::SQLite的“托管”连接和本机核心代码的本地sqlite连接。或者,如果托管版本可以生成本机句柄,您可以将其传递给核心代码,或创建采用本机连接的托管版本(如果System::Data::SQLite具有该可能性)。

请参阅:Sqlite3DatabaseHandle定义,SQLiteConnection::Handlehow it is used to open a conection及其compare with native use

也就是说,我有一个类似的问题(有一个c ++程序只需要一个c ++ / CLI(.Net)GUI。),它在我的机器上工作得很好。我想运行我的程序的所有其他机器都受到保护,我没有管理器,它始终是兼容.Net版本问题,我无法解决。根据我的需要,切换到Nana C++ GUI是一个更好的解决方案。我的核心代码已经与GUI无关,因此GUI更改并不是很困难。现在一切都是本机代码,并且通过静态链接,程序是一个小型便携式,可以在我的任何Windows机器中作为一个简单的用户运行。