C++ C栋和x2B栋+;跨多个源文件的静态数组

C++ 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

我有一个类似这样的系统:

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;
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.cppTypeTwo.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()