我的目标摘要
我想在C++中的多个.cpp
文件之间共享一个声明类的全局实例。
解释
如果你想跑得快,你可以在期望值之后跳跃
我知道很多人说我不应该使用全局变量,原因太多了。。。阅读我的解释,了解我为什么想要它们。
步骤1:
我正在使用头文件中定义的类执行C++程序
(类的函数在cpp文件中声明。(
为了解释它,我将使用一个过于简化的假设代码(不是实际的。(
简化的假设Class.h
的代码:
class Class {
public:
Class(intx,int y); //Does a lot of things
int OP1(int x); //Dummy operation
int OP2(int x); //Dummy operation
private:
type ManyVars;
}
简化假设main.cpp
的代码
#include "Class.h"
Class Member(140,360); //Declares it with parameters
bool Func1(int x) { //Dummy function
int y = Member.OP2(x);
return x > Member.OP1(y);
}
bool Func2(int x) { //Dummy function
int y = Member.OP2(x) * x;
return x > Member.OP1(y) +1;
}
int main() {
int x;
std::cin >> x;
y = Func2(x);
z = Func1(y * x / 5);
return Func2(z) + x / y;
}
就我而言,一切都很好,但main.cpp
中的代码非常大,因为我有超过16个函数,其中包括2个大函数
(为了简单起见,我在示例中只显示了两个函数。(
步骤2:
为了使代码更易于阅读,我将另外两个文件Funcs.cpp
和Funcs.h
中的小函数像库一样移动了
然后,我将大函数移动到一个新的.cpp
文件中,每个文件都包含在另一个头文件中
(在示例中隐藏,因为它类似于Funcs.cpp
。(
所以,现在假设的main.cpp
看起来是这样的:
#include "Class.h"
#include "Funcs.h"
Class Member(140,360);
int main() {
int x;
std::cin >> x;
int y = Func2(x);
int z = Func1(y * x / 5);
return Func2(z) + x / y;
}
假设的Funcs.cpp
看起来是这样的:
#include "Class.h"
#include "Funcs.h"
bool Func1(int x) {
int y = Member.OP2(x);
return x > Member.OP1(y);
}
bool Func2(int x) {
int y = Member.OP2(x) * x;
return x > Member.OP1(y) +1;
}
现在出现了一个问题:Member
仅在main.cpp
中定义,但我也需要在Funcs.cpp
(以及其他函数文件(中定义。
步骤3:
我尝试为每个函数添加另一个类型为Class
的输入值,并在使用时将Member
放入其中。它起了作用,但功能看起来很糟糕我不希望每个函数都有一个额外的参数所以我暂时将代码恢复到步骤1。
期望
我想要的是在它们之间共享相同实例的任何方式<它基本上是一个全局变量>
我想保持相同的功能。int y = Member.OP2(x)
不能更改,而每个文件的开头都可以更改
我希望能够声明多个这样的Member
(我不会,但必须可以这样做(。它基本上是一个全局变量>
有人知道以这种方式共享实例的方法吗
如果有什么不清楚的地方,请告诉我
Member
是一个全局变量。使用用于任何全局变量的常用技术共享它,在头文件中声明它,并在源文件中定义它(一次(。
在头文件中(比如Class.h(
extern Class Member;
在main.cpp 中
Class Member(140,360);
就是这样。
使用全局变量的另一种方法是通过在静态存储中存储类的唯一实例来利用Singleton Pattern(构造首次使用习语(。
有一个问题解释了这与john的答案之间的区别(参见c++常见问题解答,它解决了什么是初始化顺序失败,以及这种方法如何避免它(。
template<int x, int y>
class Class
{
public:
static Class & get_instance()
{
static Class instance; // <- called only once!
return instance;
}
Class(const Class &) = delete;
Class & operator=(const Class &) = delete;
bool OP1(int a)
{
return a > x;
}
bool OP2(int b)
{
return b > y;
}
private:
Class() = default;
~Class() = default;
};
然后,您可以通过get_instance()
方法将实例引用为
auto& Member = Class<140,360>::get_instance();