Как вызвать функцию из другой функции в C ++? - PullRequest
0 голосов
/ 02 июня 2010

У меня есть это определение функции внутри моего файла 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?
}

Должен ли я предоставить все 4 значения? Могу ли я просто отправить не значение?

Помоги мне ..

Ответы [ 4 ]

2 голосов
/ 02 июня 2010

Да, так как вы определили вещи, вы должны предоставить значения для всех параметров. Кроме того, последний параметр должен быть переменной, поскольку вы определили его для передачи по ссылке.

Если бывают ситуации, когда это кажется глупым, и вы просто хотите, чтобы он заполнил все 0 и false для вас, вы можете указать в определении значения по умолчанию, например:

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

(примечание: вы не можете указать значение по умолчанию для bHandled, так как оно передается по ссылке. Это указывает на то, что ваша подпрограмма хочет изменить его и, следовательно, должна быть изменяемой переменной).

Тогда вы можете назвать это так:

onSetRedraw(false)

Другим вариантом будет просто сделать еще одну копию процедуры без каких-либо из этих параметров. Если хотите, вы можете сделать это private, чтобы его могли вызывать только члены самого класса.

0 голосов
/ 14 мая 2016

Я думаю, что вы должны рефакторинг вашего кода. Это становится намного более пригодным для повторного использования. В вашей функции onSetRedraw почти нет ничего, что требует параметров, поэтому извлечь из нее метод еще проще

    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();
   }
0 голосов
/ 02 июня 2010

Нет, последний параметр является справочным значением, поэтому вам нужно предоставить переменную вместо значения (чтобы быть немного более точным, вам нужно предоставить lvalue вместо rvalue):

void CRebarHandler::setButtonMenu2(){
  bool b=false;
  onSetRedraw(0,0,0,b);   // note the change here
}

Как показывает ваш пример, вы должны предоставить все аргументы. Но можно предоставить аргументы по умолчанию, чтобы вам не пришлось это делать. Тем не менее, правила C ++ требуют, чтобы вы указали аргументы по умолчанию для последних параметров перед первыми значениями. Поскольку ссылка должна быть инициализирована переменной / lvalue, было бы неудобно это делать.

0 голосов
/ 02 июня 2010

Все зависит от прототипа функции: если есть перегрузка с параметрами по умолчанию, вам не нужно указывать значения внутри функции. Если нет, вам понадобятся все четыре параметра.

Поскольку оба метода относятся к одному и тому же классу, показанный вами метод * должен * работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...