C++ C栋和x2B栋+;跨多个源文件的静态数组
我有一个类似这样的系统: Master.hC++ C栋和x2B栋+;跨多个源文件的静态数组,c++,C++,我有一个类似这样的系统: Master.h extern const Activators[2]; Master.cpp #include <TypeOne.h> #include <TypeTwo.h> const Activators[2] = { &TypeOne::Create, &TypeTwo::Create }; const Activators[2]; Activators[0] = &TypeOne::Create; Ac
extern const Activators[2];
Master.cpp
#include <TypeOne.h>
#include <TypeTwo.h>
const Activators[2] = { &TypeOne::Create, &TypeTwo::Create };
const Activators[2];
Activators[0] = &TypeOne::Create;
Activators[1] = &TypeTwo::Create;
TypeOne.cpp
#include <TypeOne.h>
#include <TypeTwo.h>
const Activators[2] = { &TypeOne::Create, &TypeTwo::Create };
const Activators[2];
Activators[0] = &TypeOne::Create;
Activators[1] = &TypeTwo::Create;
TypeTwo.cpp
#include <TypeOne.h>
#include <TypeTwo.h>
const Activators[2] = { &TypeOne::Create, &TypeTwo::Create };
const Activators[2];
Activators[0] = &TypeOne::Create;
Activators[1] = &TypeTwo::Create;
对。尽管你需要非常小心
TypeOne.cpp
TypeTwo.cpp
然后,除此之外,在调用main()
之前不要访问数组
但就我个人而言,我更愿意看到
Activators
是一个std::vector
,然后让每个在之前使用std::vector::push_back()
假设Activators
是一种多形性(其中Type1
和Type2
都源于Activators
)类型,我会这样处理这个问题
活化剂
std::vector>&activators()代码>
激活剂
我将提供一个功能界面来添加激活器
,并从TypeOne.cpp和TypeTwo.cpp使用它
在激活剂.h中:
void addActivator(Activator activator);
static std::vector<Activator> activators{};
void addActivator(Activator activator)
{
activators.push_back(activator);
}
struct Initializer
{
Initializer()
{
addActivator(&TypeOne::Create);
}
};
static Initializer initializer;
struct Initializer
{
Initializer()
{
addActivator(&TypeTwo::Create);
}
};
static Initializer initializer;
在Activators.cpp中:
void addActivator(Activator activator);
static std::vector<Activator> activators{};
void addActivator(Activator activator)
{
activators.push_back(activator);
}
struct Initializer
{
Initializer()
{
addActivator(&TypeOne::Create);
}
};
static Initializer initializer;
struct Initializer
{
Initializer()
{
addActivator(&TypeTwo::Create);
}
};
static Initializer initializer;
在TypeTwo.cpp中:
void addActivator(Activator activator);
static std::vector<Activator> activators{};
void addActivator(Activator activator)
{
activators.push_back(activator);
}
struct Initializer
{
Initializer()
{
addActivator(&TypeOne::Create);
}
};
static Initializer initializer;
struct Initializer
{
Initializer()
{
addActivator(&TypeTwo::Create);
}
};
static Initializer initializer;
< C++初始化全局的方式真的很奇怪,从技术上说,到目前为止,其他答案都有未定义的行为,尽管可能在您的机器/编译器上工作。基本上,问题是当程序启动时,实现只需要初始化main.cpp中的globals及其头文件。当您的代码调用另一个CPP/头组合(翻译单元)中定义的函数时,只有C++才需要初始化一个翻译单元中的全局变量。p>
在您的特定情况下,最简单(安全)的解决方法是简单地在报头中进行初始化。如果文件包含“TypeOne.h”
,它将初始化激活器[0]
本身。为了便于移植,重要的是,包含int main()
的翻译单元(cpp文件)还包括您需要使用的所有这些的标题。否则,就不能严格保证它们在main
开始之前被初始化
第一类
#include "master.h"
class TypeOne {
static std::unique_ptr<TypeOne> Create();
//stuff
};
static const auto TypeOneInitialized = Activators[0] = &TypeOne::Create;
#包括“master.h”
第一类{
静态std::unique_ptr Create();
//东西
};
static const auto-TypeOneInitialized=激活器[0]=&TypeOne::Create;
如果您有一个cpp不应该依赖于TypeTwo,只需不包括它的标题。如何定义Activator
?让Type*.cpp包含Master.h并设置每个字段。Activator是否需要是const
?Activator不需要是const。此外,代码的可移植性如何?这里所有的答案在技术上都是未定义的行为,但在实践中几乎是完全安全的。这两个评论都是正确的。修正了。啊,这看起来正是我想要做的。合法C++是否在函数之外执行这些任务?任务需要在函数中发生。我更新了答案,给出了一种可能的方法。从技术上讲,这是不可移植的,在main.cpp
的TU尝试调用每个TU中的函数之前,不能保证全局变量被初始化。(这适用于目前为止的所有答案)@MooingDuck:真的吗?我不知道。。对于其他正在阅读的人,.@MooingDuck,也可以使用main()
打开TU1dummy_func();TU2dummy_func()代码>