【问题标题】:How to find out which derived class is processing如何找出正在处理的派生类
【发布时间】:2014-01-17 03:23:41
【问题描述】:

我有一个 BaseInterface 类,有一个由派生类实现的虚拟 void execute():

class BaseInterface
{
public:
    virtual void execute(int a) = 0;
}

而且我有大量的派生类覆盖了执行 void:

class ProcessN : public BaseInterface
{
public:
    void execute(int a);
}

我的一个派生类的执行 void 有一个错误。但是有大量的派生类。很难一一检查。我很难找到错误。

C++ 中是否有一种方法可以通过基类找出当前正在处理哪个派生类?

编辑: 好的,在对 cme​​ts 进行了有用的讨论后,我改进了我的问题:

我可以在 BaseInterface 类的构造函数中实现一些东西,以打印出当前处理派生类的信息吗?

【问题讨论】:

  • 如果您已经能够识别出其中一个派生类在execute 中存在错误,那么大概有一些类似ptrToBaseIntfThatPointsToObjOfProcessK->execute(0); 的代码会触发错误?考虑在调试器中设置条件断点。
  • 这个 bug 不是简单可调试的,它会在视图上产生视觉差异。
  • 是否可以从基类的构造函数中得到一个ptofderivedclass?

标签: c++


【解决方案1】:

您正在寻找 typeid

BaseInterface *a = new Process1();
BaseInterface *b = new Process2();

cout << typeid(*a).name() << endl;
cout << typeid(*b).name() << endl;

或者如果你想在你的 execute() 中使用,你可以简单地使用 typeid(*this)

class BaseInterface
{
public:
    virtual void execute(int a) = 0;
    //debug helper
    void print_info() { cout << typeid(*this).name() << endl; }
};

class ProcessN : public BaseInterface
{
    void execute(int a) { print_info(); }
};

【讨论】:

  • 再一次,我们一一检查所有进程,不是吗?
  • 您描述的问题不够清楚。你想让我做什么?您的 process1 到 N 将一个接一个地运行,每当出现错误时,您会在每次执行时写入日志文件或将其打印到 stdio,以便您知道当前正在运行哪个?
  • 我可以用写 cout 来做同样的事情
  • 对于 cout
  • 我认为现在肯定有人会更正您使用“派生”来表示“基础”。阅读您的问题和回答时非常困惑。我也想知道为什么你需要这么多派生类,但这不是这里的问题。
【解决方案2】:

execute 是如何被调用的......也许你可以在基类中引入一个静态方法,它以一个基类指针作为参数,并在执行之前调用这个方法,并使用 BasePointer 从这个方法中的派生对象打印必要的信息查看它是哪个派生类对象。 根据我的理解,我建议如下。如果它没有帮助所有最好的。

class Base
{
   public:
   virtual void exec(int i) =0 ;
   static void check(Base* temp)
   {
     cout<<"Type of obj"<<typeid(*temp).name()<<endl;
    }
 };
class Derived1 : public Base
{
 public:
 void exec(int i)
 {
  cout<<"Der1 Exe "<<i<<endl;
  }
 };

class Derived2 : public Base
{    
 public: 
 void exec(int i)
 {
   cout<<"Der2 Exe "<<i<<endl;

 }
};
int main()
{   
  Base *client = NULL;  
  Derived1 lder1;
  Derived2 lder2;
  client= &lder2;
  Base::check(client);
  client->exec(0);

  client= &lder1;
  Base::check(client);
  client->exec(0);
 return 0;
}

【讨论】:

  • Hey Munni,请问有没有不接触派生对象的方法。
猜你喜欢
  • 2020-08-06
  • 2022-01-02
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2015-07-08
  • 2017-09-23
相关资源
最近更新 更多