类的静态成员变量

时间:2014-03-10 15:03:29

标签: c++ opencv

我将SVM分类保存为“classifier.xml”。我从网络摄像头获取输入图像,并希望对它们进行分类。因此,不是为每个输入图像加载分类器,而是我只想使用以下代码加载分类器一次(类似静态)

mySvm.load("classifier.xml");

问题:目前我已将cv::SVM mySvm;声明为全局变量,但我想摆脱全局变量。那么,我该怎么做才能将cv::SVM mySvm;作为Class Classifier的成员变量?

我的文件结构如下:

(1)classifier.h

class Classifier
{
    private:


    public:
        void getSvm();
};

(2)main.cpp

int main()
{
    Classifier objectSvm;
    objectSvm.getSvm();                     
}

(3)loadSVM.cpp

#include "classifier.h"

cv::SVM mySvm;
void svm::getSvm()
{
    mySvm.load("classifier.xml");
}

2 个答案:

答案 0 :(得分:0)

您可以使用静态成员变量并提供访问它的方法:

class Classifier
{
private:
    static cv::SVM svm;

public:
    void loadSvm(const char* fileName) { /* code for loading SVM */ }
    cv::SVM& getSVM() { return svm; }
};

成员函数loadSVM执行加载,getSVM只返回对变量的引用。

如果您担心用户多次加载SVM,请添加一个类型为bool的静态成员,指示该对象是否已加载。

class Classifier
{
private:
    static cv::SVM svm;
    static bool already_loaded = false; // required C++11

public:
    void loadSvm(const char* fileName)
    {
        if (already_initialized)
            return;

        // code for loading SVM
    }

    cv::SVM& getSVM() { return svm; }
};

然后像往常一样创建Classifier的实例并加载XML。

int main()
{
    Classifier c;
    c.loadSVM("foo.xml");

    // Whenever you want to use the SVM, go for member function `getSVM()`.
    // E.g. assuming the SVM has a `foo` member function:
    c.getSVM().foo();
}

答案 1 :(得分:0)

(1)classifier.h

namespace cv { class SVM; }
class Classifier
{
    private:
        cv::SVM mySvm;
        void loadSvm();

    public:
        Classifier();
        void getSvm();
};

(3)loadSVM.cpp

#include "classifier.h"

void Classifier::loadSVM() {  mySvm.load("classifier.xml"); }
Classifier::Classifier() { /* loadSVM(); could load early */ }
void Classifier::getSvm() { loadSVM(); }

(2)main.cpp

int main()
{
    Classifier objectSvm;
    objectSvm.getSvm();   // loading happens on this line, as your example
                          // loading only shared for this instance of Classifier

    objectSvm.doSomething();
    objectSvm.doSomethingAgainWithSameClassifier();

    Classifier objectSvmAnother;
    objectSvmAnother.getSvm();  // load another classifier

    objectSvmAnother.doSomethingWithDifferentClassifierInstance();
}