如何将显式声明的构造函数分隔为.h& .cpp文件?

时间:2016-06-08 17:50:08

标签: c++

这是我在OpenCV教程(源https://github.com/Itseez/opencv/blob/master/samples/cpp/tutorial_code/core/file_input_output/file_input_output.cpp)中找到的一段代码。因为代码都在一个文件中,所以我尝试将它分成header和cpp。我的问题是我无法找到如何正确地做到不生成错误C4430:缺少类型说明符 - 假设的int。注意:C ++不支持default-int。

class MyData
{
public:
MyData() : A(0), X(0), id() {}
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
{}
void write(FileStorage& fs) const //Write serialization for this class
{
fs << "{" << "A" << A << "X" << X << "id" << id << "}";
}

public: // Data Members
int A;
double X;
string id;
};

所以这是我坚持的部分:

MyData() : A(0), X(0), id() {}
explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to 

我尝试过的声明(标题文件):

class MyData
{
    public: // Data Members
        int A;
        double X;
        std::string id;

        MyData() ;
        explicit MyData(int);

    void write(cv::FileStorage& fs) const;
    void read(const cv::FileNode& node);
};

#endif

.cpp中的东西

MyData::MyData() : A(0), X(0), id() {}  // this is simple

但接下来呢?

MyData::MyData(int) : 
    A(97), X(CV_PI), id("mydata1234") {};
MyData::write(cv::FileStorage& fs) const 
{ // ... it will stuck here C4430 
 }

使用Visual Studio 2010

3 个答案:

答案 0 :(得分:1)

MyData::write(cv::FileStorage& fs) const 
{ // ... it will stuck here C4430 
 }

C4430是“缺少类型说明符”。这是因为MyData::write()实现不包含返回类型。只有构造函数应该省略返回类型。将其更改为void MyData::write(cv::FileStorage& fs) const以匹配其声明。

答案 1 :(得分:1)

要在类定义之外为write方法添加正文,格式为:

return-type classname::methodname(parameters)
{
}

所以在这种情况下:

void MyData::write(cv::FileStorage& fs) const 
{ 

}

答案 2 :(得分:1)

在你的hpp中,当你宣布它应该是这样的时候:

class Name{
 .....some other functions  ....
void write(cv::FileStorage& fs);
};

在您的cpp中,首先需要包含您的hpp然后:

void Name::write(cv::FileStorage& fs)
{
    .......body...
}

首先说明功能的类型(在本例中为void),然后是class的名称,然后是::,然后是功能名称。

希望这有助于:)