如何只允许在调用函数 B 后调用函数 A?
How can I only allow a function A to be called only after function B is called?
请考虑以下代码类:
class A {
public:
int number;
vector<int> powers;
A () {
number = 5;
powers.resize(100);
}
long long getPower(int x) {
return powers[x];
}
void precompute() {
powers[0] = 1;
for (int i = 1; i < 100; i++) {
powers[i] = powers[i - 1] * number;
}
}
};
在类A
中,我们有一个名为powers
的向量和一个整数number
,其属性powers[k]
存储调用precompute()
函数后的数量numbers^k
。如果我们想回答"为某个整数0 <= x < 100
计算numbers^x
"形式的几个查询,那么预先计算所有这些幂并在需要它们时将它们作为常量时间操作返回是有意义的(注意:这不是我实际面临的问题。为了一个例子,我编造了这个问题。请忽略numbers^x
将超过long long
的最大值的事实(。
但是,存在一个问题:用户必须先调用precompute()
函数,然后才能调用getPower()
函数。
这让我想到了以下问题:是否有一些好方法可以强制执行某些函数A
只能在调用函数B
后调用的约束?当然,可以只使用flag
变量,但我想知道是否有更优雅的方法可以做到这一点,以便它成为编译时错误。
另一种选择是始终在构造函数中调用precompute()
函数,但如果一开始我们并不总是调用precompute()
,这可能不是最佳解决方案。如果调用precompute()
的成本足够高(计算(,则此方法将不可取。
我宁愿得到编译时错误而不是运行时错误,但我对所有方法都持开放态度。有人有什么想法吗?
您的问题的一种解决方案是在class A
的构造函数中调用precompute
函数。
或者,正如注释部分中已经建议的那样,您可以使函数getPower
检查一个标志,该标志指定是否已调用precompute
,如果没有,则执行调用本身或打印错误消息。
我想不出一种强制在编译时完成此检查的方法。但是,如果要从发布版本中消除此运行时检查,则可以使用条件编译,以便这些检查仅包含在调试版本中,例如通过使用assert
宏或使用预处理器指令,如下所示:
// note that NDEBUG is normally only defined in release builds, not debug builds
#ifdef NDEBUG
//check for flag here and print error message if flag has unexpected value
#endif
作为替代方法,若要强制实施计时依赖关系,可以将依赖关系显式化。
例如:
class PowerGetter
{
friend class A;
const A& a;
public:
long long getPower(int x) {
return a.powers[x];
}
};
class A {
public:
int number = 5;
std::vector<int> powers = std::vector<int>(100);
A() = default;
PowerGetter precompute() {
powers[0] = 1;
for (int i = 1; i < 100; i++) {
powers[i] = powers[i - 1] * number;
}
return {*this};
}
};
然后要调用getPower
我们需要一个只能通过先调用precompute
来获得的PowerGetter
。
对于这个人为的例子,更简单的是将初始化放在A
中。
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?