C / CLI и C # singleton

#c# #.net #singleton #c -cli

#c# #.net #синглтон #c -cli

Вопрос:

У меня есть библиотека DLL cpp / cli, в которой есть класс DataMiner. Это синглтон. Весь мой код cpp / cli находится в пространстве имен DataMine.

 public ref class DataMiner
{
private:
    DataMiner();
    void(*stdout_callback) (const char* cb);
    static DataMiner dm_instance;
public:
    static property DataMiner^ Instance { DataMiner^ get() { return %dm_instance; } }
    void setCB(System::IntPtr cb);
    void status_print(std::string s);
    void K_Means(array<float>^ data);
};
  

У меня также есть класс cpp / cli, который я использую для выполнения некоторой математики:

 public ref class KMeans
{
private:
    int _N;
    int _K;
    int* _kMembership;
    float _kSSE;
    float* _sse;
    float* _individualSE;
    float* _data;
    float* _centroids;
    float** _distances;
    KMeans() {};
    //void reformClusters();
public:
    KMeans(float* data, int N, int K);
    KMeans(float* data, float* centroids, int N, int K);
    ~KMeans();
};
  

На стороне C # у меня есть следующие (корректно работающие) строки:

 DataMiner dm = DataMiner.Instance;
dm.setCB(Marshal.GetFunctionPointerForDelegate(MainWindow.Instance.statusWindow.dz));
  

Однако, когда я пытаюсь использовать эту же строку в конструкторе KMeans на стороне cpp / cli, это не работает:

 KMeans(float* data, int N, int K)
{
    // (some code)
    DataMiner dm = DataMiner.Instance;
    // (some more code)
}
  

Фактические сообщения об ошибках, которые я получаю, следующие:

 DataMine::DataMiner : illegal use of this type as an expression left of '.Instance' must have class/struct/union
'DataMine::DataMiner::DataMiner' : candidate function(s) not accessible
  

Комментарии:

1. Да, в C это DataMiner::Instance ( :: не . ) для свойств, принадлежащих классу (а не экземпляру).

Ответ №1:

Мой C / CLI немного устарел, но я думаю, вы хотите использовать

 DataMiner dm = DataMiner::Instance;
  

Потому :: что оператор используется для статических членов.