- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C++(不是 C++11)
假设我的项目中有 100 个 .cpp 文件,它们目前正在做一些工作。所有这些文件目前都包含一些我可以轻松编辑的 globals.h 文件。
我希望这些文件中的每一个都有自己的某个对象实例,并且我还希望该实例具有实例化它的文件的一些唯一 ID。此外,我希望通过工厂方法创建这些对象,并且我需要实例为用户提供某种方式来处理它们 - 这意味着它们不能是匿名的。
简而言之——我需要一种方法来为我的项目中的所有文件生成唯一的 ID,我需要文件能够在所有文件中使用相同的名称访问它自己的 ID,而且能够访问另一个“管理器”文件中外部文件的 ID。
以下是无效的选项:
1.枚举:
如果我使用枚举并给每个文件一个枚举 ID,现在我不能在 globals.h 中这样做:
static thePrivateInstanceInThisFile = theFactory.makeInstance(fileID);
因为我需要在每个文件中使用不同的 fileID
,并且它是静态定义的,并使用我的枚举唯一命名。
2。统计自己实例的类
在globals.h中定义:
class FileIDGiver{
private:
static int currentID;//initialize to 0 in cpp
int myID;
public:
FileIDGiver(){
myID = currentID++;
}
int getFileID(){
return myID;
}
}
static FileIDGiver theFileId;
static thePrivateInstanceInThisFile = theFactory.makeInstance(theFileId.getFileID());
这将为每个静态文件实例提供一个文件唯一的 ID,但现在它无法在文件外部进行管理。
我想过做类似的事情
globals.cpp
int file1ID;
int file2ID;
...
globals.h
extern file1ID;
extern file2ID;
...
file1.cpp
file1ID = theFileId.getFileID();
file2.cpp
file2ID = theFileId.getFileID();
...
每当用户需要管理文件时,他要么使用文件的 ID 变量,要么以上述方式创建一个新文件。
这将允许我从外部访问每个唯一且自动的文件 ID。我遇到的唯一问题是 file1ID = theFileId.getFileID();
行仅在运行时执行,在 static thePrivateInstanceInThisFile = theFactory.makeInstance(theFileId.getFileID()); 行之后
。在编译时执行。
我想不出一个好方法来颠倒这个顺序,或者可能做一个完整的其他机制。
再次 - 我需要:
自动创建的文件 ID
唯一的文件 ID(最好是数字)
在所有文件中通过相同的变量名称使用这些 ID(自动地,使用 globals.h 文件中的静态变量定义)
能够使用另一个手动定义的变量手动访问特定文件 ID。
请指教一些好的方法来完成这个
谢谢。
最佳答案
这听起来像是 static initialization order fiasco 的一个糟糕案例.
这是一个解决方案,它为每个文件唯一分配整数 ID,然后通过使用文件 ID 调用工厂函数生成唯一的 Instance
,同时确保 Instance
工厂在首次使用前被初始化:
idgiver.h
:
class IdGiver
{
int id;
public:
IdGiver() : id(0) {}
int getId() {return id++;}
};
IdGiver &getTheIdGiver();
idgiver.cpp
:
#include "idgiver.h"
IdGiver &getTheIdGiver()
{
static IdGiver theIdGiver;
return theIdGiver;
}
factory.h
:
class Instance
{
// ...
};
class Factory
{
// ...
public:
Factory() : {/*...*/}
Instance getInstance(int id) {/*...*/}
};
Factory &getTheFactory();
factory.cpp
:
#include "factory.h"
Factory &getTheFactory()
{
static Factory theFactory;
return theFactory;
}
globals.h
:
#include "idgiver.h"
#include "factory.h"
static int thisFileId = getTheIdGiver().getId();
static Instance thisFileInstance = getTheFactory().getInstance(thisFileId);
关于c++ - 如何在 C++ 中管理文件唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407210/
我是一名优秀的程序员,十分优秀!