怎么使类的构造函数得到extern声明
时间: 2023-06-14 07:06:57 浏览: 54
在C++中,extern关键字用于声明一个全局变量或函数的存在,但并不定义它们的实际内容。因此,extern关键字不能用于类的构造函数。
类的构造函数应该在类的定义中被声明和定义,可以将其声明为public或private访问模式。如果需要在其他文件中使用该类的构造函数,可以将类的定义放在一个头文件中,并在其他文件中包含该头文件。
例如,在类的头文件中定义和声明构造函数:
```
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
public:
MyClass(); // 构造函数声明
void someMethod();
private:
int someVariable;
};
#endif // MYCLASS_H
```
在类的实现文件中定义构造函数:
```
#include "MyClass.h"
MyClass::MyClass() {
someVariable = 0;
}
void MyClass::someMethod() {
// do something
}
```
在其他文件中使用该类的构造函数,只需要包含类的头文件:
```
#include "MyClass.h"
int main() {
MyClass myObject; // 构造函数被调用
return 0;
}
```
相关问题
extern“C”作用有那些,请详细说明
extern "C" 的作用是用于告诉编译器按照 C 语言的方式进行编译。具体来说,它起到了两个作用:
1. 解决 C++ 函数名重载问题
在 C++ 中,函数名可以相同,但函数参数不同的情况下会被视为不同的函数,这被称为函数名重载。而 C 语言不支持函数名重载。为了在 C++ 中使用 C 的函数库或者在 C++ 中与其他语言进行交互时,需要在 C++ 中声明这个函数为 extern "C" 类型,以便于在链接过程中使用正确的函数名。
例如,在 C++ 中声明一个函数为 extern "C":
```
extern "C" {
void my_function(int arg);
}
```
实际上会被编译成以下形式的 C 语言代码:
```
void my_function(int arg);
```
这样,在链接时就可以正确地找到这个被声明为 extern "C" 的函数。
2. 确保函数的 C++ 特性不被编译器改变
在 C++ 中,函数可能具有一些 C++ 特性,如构造函数、析构函数和异常处理等。使用 extern "C" 可以防止编译器将函数编译成无法使用这些特性的代码。
总之,extern "C" 主要用于编写遵循 C 标准的代码和与其他语言进行交互。
函数cap重定义多次初始化
在C++中,函数重定义的错误通常是因为同一个函数在多个地方被定义了。如果在多个源文件中都使用了`cv::VideoCapture`类的构造函数来初始化摄像头设备,就会出现函数重定义的错误。
解决方法是将`cv::VideoCapture`类的构造函数调用放在一个单独的源文件中,并将其声明为全局变量。然后在其他源文件中通过头文件来引用该全局变量,而不是再次调用构造函数来初始化摄像头设备。具体代码如下:
video_capture.h文件:
```cpp
#ifndef VIDEO_CAPTURE_H
#define VIDEO_CAPTURE_H
#include <opencv2/opencv.hpp>
extern cv::VideoCapture cap;
#endif // VIDEO_CAPTURE_H
```
video_capture.cpp文件:
```cpp
#include "video_capture.h"
cv::VideoCapture cap(0); // 初始化摄像头设备
```
其他源文件中使用摄像头设备:
```cpp
#include "video_capture.h"
int main() {
if (!cap.isOpened()) {
std::cout << "Failed to open video capture device" << std::endl;
return -1;
}
// 使用摄像头设备
// ...
return 0;
}
```
在上述代码中,`video_capture.h`头文件中声明了一个全局变量`cap`,其他源文件中通过引用该头文件来使用该全局变量。在`video_capture.cpp`文件中,`cap`变量被初始化为摄像头设备,并且只会被初始化一次。这样就可以避免函数重定义的错误。