gpt4 book ai didi

c++ - 在函数的命名空间中初始化变量

转载 作者:行者123 更新时间:2023-12-04 17:01:00 26 4
gpt4 key购买 nike

我已经多次在命名空间中设置变量时遇到问题,但现在通常通过如下设置来解决它:
。H

namespace MyNS {
extern Variable var;
}
.cpp
#include "MyNS.h"
Variable MyNS::var;
现在,这适用于原语,但在 Variable 时会成为问题。 object 是一个更复杂的对象。
也就是说,这次我的问题是我想保留一些未初始化的变量,直到我调用某个函数。如下:
。H
namespace MyNS {
extern Variable var;
void init();
}
.cpp
#include "MyNS.h"
Variable MyNS::var;
void MyNS::init() { var = Variable(a, b, c); }
这会导致编译时错误,因为 Variable没有默认构造函数(我不希望它有一个)。但是当我删除 2nd 时行在 .cpp , 我收到链接器错误 unresolved external symbol .
我怎么解决这个问题?如何“稍后”初始化命名空间的变量?
到目前为止,我拥有的“hacky”解决方案是让我的命名空间保存 Variable* , 初始化为 nullptr ,然后将我的 init 中的实际对象分配给它功能。但是对于如此简单的事情来说,这似乎令人难以置信,因为在这种情况下我没有实际理由使用指针。

最佳答案

Variable does not have a default constructor (And I don't want it to have one)


那么你根本无法创建 Variable 的实例不将值传递到其构造函数中,例如:
namespace MyNS {
extern Variable var;
void init();
}
#include "MyNS.h"

Variable MyNS::var(0, 0, 0);

void MyNS::init() { var = Variable(a, b, c); }
另一种解决方案是使 var成为 Variable*改为指针,然后 init()可以 new它,例如:
namespace MyNS {
extern Variable* var;
void init();
void cleanup();
}
#include "MyNS.h"

Variable* MyNS::var = nullptr;

void MyNS::init() { var = new Variable(a, b, c); }
void MyNS::cleanup() { delete var; }
或者:
#include <memory>

namespace MyNS {
extern std::unique_ptr<Variable> var;
void init();
}
#include "MyNS.h"

std::unique_ptr<Variable> MyNS::var;

void MyNS::init() { var = std::make_unique<Variable>(a, b, c); }
另一种解决方案是制作 var成为 std::optional<Variable>相反,例如:
#include <optional>

namespace MyNS {
extern std::optional<Variable> var;
void init();
}
#include "MyNS.h"

std::optional<Variable> MyNS::var;

void MyNS::init() { var = Variable(a, b, c); }
另一种解决方案是包装 var单例内部,例如:
namespace MyNS {
struct VariableAccess {
static Variable& Var();
};
}
#include "MyNS.h"

Variable& MyNS::VariableAccess::Var() {
static Variable var(a, b, c);
return var;
};

关于c++ - 在函数的命名空间中初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66977075/

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