gpt4 book ai didi

c++ - 如何在 C++ 中管理文件唯一 ID

转载 作者:行者123 更新时间:2023-11-28 00:14:08 24 4
gpt4 key购买 nike

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()); 行之后。在编译时执行。

我想不出一个好方法来颠倒这个顺序,或者可能做一个完整的其他机制。

再次 - 我需要:

  1. 自动创建的文件 ID

  2. 唯一的文件 ID(最好是数字)

  3. 在所有文件中通过相同的变量名称使用这些 ID(自动地,使用 globals.h 文件中的静态变量定义)

  4. 能够使用另一个手动定义的变量手动访问特定文件 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com