C ++:如何使用静态函数定义类

时间:2012-10-13 10:16:02

标签: c++ opencv static-methods

我想创建一个C ++类,它只与静态函数合并,无论如何都可以使用。我创建了一个包含声明的.h文件和一个包含定义的.cpp文件。但是,当我在我的代码中使用它时,我收到一些奇怪的错误消息,我不知道如何解决。

以下是我的Utils.h文件的内容:

#include <iostream>
#include <fstream>
#include <sstream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

#include <vector>
#include <opencv/cv.h>
#include <opencv/cxcore.h>

class Utils
{
public:
    static void drawPoint(Mat &img, int R, int G, int B, int x, int y);
};

以下是我的Utils.cpp文件的内容:

#include "Utils.h"

void Utils::drawPoint(Mat &img, int R, int G, int B, int x, int y)
{
img.at<Vec3b>(x, y)[0] = R;
img.at<Vec3b>(x, y)[1] = G;
img.at<Vec3b>(x, y)[2] = B;
}

这就是我想在main函数中使用它的方法:

#include <iostream>
#include <fstream>
#include <sstream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

#include <vector>
#include <opencv/cv.h>
#include <opencv/cxcore.h>

#include "CThinPlateSpline.h"
#include "Utils.h"

int main()
{
Mat img = imread("D:\\image.png");
if (img.empty()) 
{
    cout << "Cannot load image!" << endl;
    system("PAUSE");
    return -1;
}
Utils.drawPoint(img, 0, 255, 0, 20, 20);
imshow("Original Image", img);
waitKey(0);
return 0;
}

以下是我收到的错误。

有人能指出我做错了什么吗?我错过了什么?

3 个答案:

答案 0 :(得分:5)

Utils::drawPoint(img, 0, 255, 0, 20, 20);
     ^^ (not period)

是你如何调用静态函数。期间是成员访问(即,当你有一个实例)。

说明完整性:

Utils utils; << create an instance
utils.drawPoint(img, 0, 255, 0, 20, 20);
     ^ OK here

答案 1 :(得分:1)

认为你在班级减速后错过了一个分号。尝试,

class Utils
{
public:
    static void drawPoint(Mat &img, int R, int G, int B, int x, int y);
}; // <- Notice the added semicolon

答案 2 :(得分:0)

这不是您问题的直接答案,但使用命名空间作用域函数可能更适合您的需求。我的意思是:

namespace Utils
{
    void drawPoint(Mat &img, int R, int G, int B, int x, int y);
}

::语义保持不变但现在:

  • 您无法实例化Utils对象,这对“静态类”无意义
  • 您可以使用using Utils来避免选择(和有限)范围内的Utils::前缀

有关静态类成员函数与命名空间作用域函数的优缺点的深入讨论,请参阅:Namespace + functions versus static methods on a class