Visual c++ 如何在c++;?

Visual c++ 如何在c++;?,visual-c++,Visual C++,我在我的cpp文件中有这个函数定义 LRESULT CRebarHandler::onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { bHandled=false; if (m_ieVer==6){ if (!m_hWndToolbar) scanForToolbarSlow(); } return S_OK; }

我在我的cpp文件中有这个函数定义

    LRESULT CRebarHandler::onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
    {
     bHandled=false;
     if (m_ieVer==6){
      if (!m_hWndToolbar)
      scanForToolbarSlow();
     }
    return S_OK;
   }
我的问题是我不知道如何从同一文件中的另一个函数调用它。我想从这个函数调用它:

 void CRebarHandler::setButtonMenu2(){
 bool b=false;
 onSetRedraw(0,0,0,false);   <------ is this the correct way?
}
void CRebarHandler::setButtonMenu2(){
布尔b=假;

onSetDraw(0,0,0,false);这一切都取决于函数原型,如果存在带有默认参数的重载,则不需要从函数中提供值。如果没有,则需要所有四个参数


因为两个方法似乎在同一个类中,所以您显示的方法*应该*起作用。

是的,按照您定义事物的方式,您必须为所有参数提供值。此外,最后一个参数必须是一个变量,因为您将其定义为通过引用传递

如果在某些情况下,这似乎有点愚蠢,而您只是希望它为您填写所有0和false,那么您可以使用这些值作为默认值提供定义,如下所示:

LRESULT CRebarHandler::onSetRedraw(UINT uMsg=0, WPARAM wParam=0, LPARAM lParam=0, BOOL& bHandled)  
    { 
(注意:您不能为bHandled提供默认值,因为它是通过引用传递的。这表示您的例程想要修改它,因此它必须是一个可修改的变量)

然后你可以这样称呼它:

onSetRedraw(false)

另一种选择是只制作例程的另一个副本,而不包含任何这些参数。如果需要,可以将其设置为私有,这样只有类本身的成员才能调用它。

否,最后一个参数是参考值,因此需要提供变量而不是值(为了更加准确,您需要提供左值而不是右值):


正如您的示例所示,必须提供所有参数。但是,可以提供默认参数,这样就不必了。换句话说,C++规则要求您在第一个值之前为最后的参数提供默认参数。s、

我认为你应该重构你的代码。它变得更加可重用。 OnSetDraw函数中几乎没有需要参数的东西,因此从中提取方法更容易

    void CRebarHandler::scan()
    {
     if (m_ieVer==6){
      if (!m_hWndToolbar)
       scanForToolbarSlow();´
     }
    }

    LRESULT CRebarHandler::onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
    {
     bHandled=false;
     scan();

     return S_OK;
   }



   void CRebarHandler::setButtonMenu2()
   {
     bool b=false;
     scan();
   }
    void CRebarHandler::scan()
    {
     if (m_ieVer==6){
      if (!m_hWndToolbar)
       scanForToolbarSlow();´
     }
    }

    LRESULT CRebarHandler::onSetRedraw(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
    {
     bHandled=false;
     scan();

     return S_OK;
   }



   void CRebarHandler::setButtonMenu2()
   {
     bool b=false;
     scan();
   }