2017-03-29 15 views
1

私は小さなC++プロジェクトにGUIを実装しようとしていますが、今はC++/cliで管理対象外のC++コードを使用しようとしていますWindowsフォームを使用します。私は管理sqliteのバージョンに移動しようとしていると私はエラーコードを取得します: "管理されていないクラスのメンバーは、refクラスの型またはインターフェイスクラスの型を持つことはできません"しようとするときクラスのメンバに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(); 
}; 
+0

エラーメッセージについては不明ですか?アンマネージドクラスにマネージクラスメンバを持つことはできません。 –

+0

私の質問は、このエラーを回避する方法です。 – Kfirka

+1

これは簡単です:1)このクラスを管理するか、2)アンマネージドクラス内でマネージ型を使用しないでください。 –

答えて

1

ネイティブのC++コードから管理対象オブジェクトにアクセスする(作成すると言うわけではありません)妥当な方法はわかりません。

しかし、それは重要ではありません。あなたはあなたがC++/CLI(.Net)のGUIだけを必要とするC++プログラムを持っていると言いました。 As @AlgirdasPreidžiusは、ネイティブコードやマネージコードではなく、ミックスではなく、機能を配置する場所を決める必要があると述べています。

あなたのケースでは、コアコードとは何かを明確にする必要がありますし、混在しないようにしてください。 コアはGUIについては無関心(使用しないでください)でなければなりません。 GUIは非常に制御された形でコアにアクセスする必要があります。この場合、管理対象クラスに挿入されたコアのネイティブクラスへのポインタを持つだけで便利です。それは「うまくいく」。 SQLiteがコアまたはGUIに属するかどうかを判断する必要があります。ここで私が見るのは、GUIで使用されるSystem::Data::SQLiteの「管理された」接続と、ネイティブのコアコードのためのネイティブのsqlite接続で、GUIとコアで異なる方法でデータベースにアクセスすることです。または、マネージドバージョンがネイティブハンドルを生成できる場合は、コアコードに渡すか、ネイティブの接続を持つマネージドバージョンを作成します(System::Data::SQLiteにそのポテンシャルがある場合)。

参照:Sqlite3DatabaseHandle定義、SQLiteConnection::Handle、およびhow it is used to open a conectionとはどのようにcompare with native useですか。

私は同様の問題(C++/CLI(.Net)GUIだけが必要なC++プログラムを持っています)を持っていました。私のプログラムを実行したい他のマシンはすべて保護されていましたが、私はそこに管理者の権限がなく、常に互換性のない.Netバージョンの問題でした。私のニーズに合わせて、Nana C++ GUIに切り替える方が良い解決策でした。私のコアコードはすでにGUIに依存していなかったので、GUIの変更はあまり難しくありませんでした。今ではすべてがネイティブコードであり、静的なリンクでプログラムは簡単なユーザーとして私のWindowsマシンのいずれかでaeaslyを実行するよりも小さな移植可能なejecutableです。

関連する問題