c++ - 测试函数是虚函数还是构造函数

标签 c++ reflection coding-style constructor destructor

我正在阅读Never Call Virtual Functions during Construction or Destruction作者:Scott Meyer,关于 C++ 的基本用法。

我想知道 g++ 是否有一些编译器标志来警告这种真正有效的错误编码。如果不是,可能有什么方法可以编写代码来进行此检查?

如果我要编写此类检查的代码,我将通过使用堆栈并在每次调用时插入一条信息来完成这项工作(一种实现调用堆栈的方法。

我仍然需要一种方法来测试函数是否为虚拟函数或函数是否为构造函数:您知道有什么办法可以做到这一点吗?类似于 .NET“反射”想法的东西吗?

最佳答案

> cat nevercall.cpp             
class Transaction {
public:
    Transaction();
    virtual void logTransaction() const = 0;

    // ...
};

Transaction::Transaction()
{
    //...
    logTransaction();
}

class BuyTransaction: public Transaction {
public:
    virtual void logTransaction() const;

    //...
};

class SellTransaction: public Transaction {
public:
    virtual void logTransaction() const;

    // ...
};

int main()
{
    BuyTransaction b;
}

当(且仅当)virtual void Transaction::logTransaction() constpure时,使用-Weffc++会发出警告,因为它在 Meyer 的示例代码中:

> g++ -Weffc++ nevercall.cpp -o nevercall
nevercall.cpp:1:7: warning: 'class Transaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
nevercall.cpp: In constructor 'Transaction::Transaction()':
nevercall.cpp:12:20: warning: pure virtual 'virtual void Transaction::logTransaction() const' called from constructor [enabled by default]
nevercall.cpp: At global scope:
nevercall.cpp:15:7: warning: 'class BuyTransaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
nevercall.cpp:22:7: warning: 'class SellTransaction' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]

关于c++ - 测试函数是虚函数还是构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782878/

相关文章:

java - 从 Java 程序中获取局部变量的名称和类型

Scala Class.getFields

Objective-C 编码标准?

C++ 意外挂起时间

c++ - 为什么编译器选择 bool 而不是 string 来进行 L""的隐式类型转换?

c++ - GLUT 程序仅适用于几帧

javascript - Extjs 5 通过停靠按钮的单击事件引用网格而不使用 .up?

c# - CoCreateInstance 异常。在静态库上使用 REGSVR32 进行类注册?

Java:将字符串动态转换为原始类型

javascript - PhpStorm/WebStorm 和标准 linting 错误