确保编译时的调用方法
Ensuring a call method at compile time
如何确保在编译时调用特定方法?
例如,假设我有一个包含 2 个方法的对象:
struct Foo
{
... func1(...);
... func2(...);
};
我想确保在调用 func2 之前调用 func1,即:
int main()
{
Foo f;
...
f.func1(...);
f.func2(...);
f.func2(...); // and so on
}
但是如果我做这样的事情,我想生成编译错误:
int main()
{
Foo f;
...
f.func2(...); // generate a compile error due the fact that func1 must be called first
f.func1(...);
f.func2(...); // and so on
}
虽然很好奇为什么要这样做,但一般注意事项是您必须向用户公开一个不能错误使用的界面。胆量私有化:
struct Foo
{
public:
void callme()
{
func1();
func2();
}
private:
... func1(...);
... func2(...);
};
int main()
{
Foo f;
f.callme();
}
如果需要强制一次性初始化对象,请在构造函数中执行此操作:
struct Foo
{
public:
Foo()
{
func1();
}
func2(...);
private:
... func1(...);
};
int main()
{
Foo f; // func1() called automagically
f.func2();
}
在设计类接口时,你必须考虑最糟糕的事情:用户从不阅读文档,用户总是忘记调用foo.initialize()
,用户总是忘记释放内存和泄漏,等等。
在
div class="answers> 我想编译时没有真正的方法来强制执行。 这是对象本身需要通过运行时检查强制执行的<</p>
到的一个方法是让返回 func1() 一个对象,它的作用类似于 func2() 的代理:
class Foo {
public:
Proxy func1();
private:
void func2();
friend class Proxy;
};
class Proxy {
private:
explicit Proxy(Foo& f) : f_(f) {}
public:
void func2() {
f_.func2();
}
friend class Foo;
};
Foo f;
f.func1().func2();
另一种方法(也是我最喜欢的)是让 func1() 成为构造函数或使用另一个类,在其构造函数中调用 func1():
class Foo
{
private:
void func1(), func2();
friend class FooUser;
};
class FooUser
{
public:
explicit Proxy(FooUser& f) : f_(f) {
f.func1();
}
void func2() {
f_.func2();
}
};
编译器无法强制执行函数调用的顺序,因为通常只能在运行时确定。但它可以在使用对象之前强制对象初始化。因此,获得编译时检查的最佳方法是执行func1
在构造函数中执行的任何操作 - Foo
构造函数的一部分,或者您需要创建的帮助程序对象才能调用func2
。
我真的不建议这样做,但是如果您需要它进行调试,可以尝试以下操作。将每个调用 func1() 更改为
#define FLAG
func1();
和 func2() 到
#ifdef FLAG
func2();
#else
#error func1 should be called first!
#endif
因此,如果 func2() 将在文本中提到,则 func1,您将收到编译时错误。这并不意味着在执行过程中会更早地调用它。
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法