我有一个全局类实例:
myclass.h
class Cmyclass {
public:
void log(const char* msg);
void set_file(std::string file);
private:
std::string file;
};
myclass.cpp
void Cmyclass::log(const char* msg) {
std::ofstream output_file(file.c_str(), std::ios::app) ;
output_file << msg << std::endl;
}
void Cmyclass::set_file(std::string file) {
this->file = file;
}
我在需要访问全局的文件中使用'extern'关键字:
extern Cmyclass myclass;
我想删除set_file()方法并在构造函数中设置文件:
Cmyclass::Cmyclass(std::string file) {
this->file = file;
}
但是如果我这样做,由于构造函数中的参数,我上面的外部用法不再有效。 如果我的构造函数有参数,是否可以使用extern关键字?
谢谢!
P.S。这里有点明确...请注意上面的代码可以工作,我在其他地方实例化了类,但我想修改我的类,以便构造函数接受参数。如果是这样的话,我的外部声明应该如何?
答案 0 :(得分:1)
如评论中所示:
extern
是声明而不是定义。它只是意味着那个类型的全局变量。所以你有一些头文件(例如Globals.h)
extern Cmyclass myclass;
现在,如果您不希望链接器失败,必须在某个源文件中(例如Globals.C)
Cmyclass myclass;
现在,上面调用没有参数的构造函数。如果您只有一个带参数的构造函数,则可以将其替换为(在源文件中):
Cmyclass myclass=Cmyclass("Some File");
......但外部声明保持不变。以这种方式思考,其他人不关心你如何创建myclass
全局变量,他们只是对使用它感兴趣。因此,它具有参数构造函数或者不仅仅在变量实例化时很重要(并且发生在* .C上,而不是在* .h上)