Это происходит потому, что вы применяете один объект m_execute
к другому объекту.
Исправьте это, изменив эту строку
(m_b->*m_execute)();
// ^^^^^^^^^
// Points to your m_execute, not m_b's
на это:
(m_b->*m_b->m_execute)();
Еще лучше добавить функцию-член для запуска собственного выполнения и вызвать его из B::find
:
void find() {
run_my_execute();
m_b->run_my_execute();
}
void run_my_execute() {
(this->*m_execute)();
}
Это позволило бы избежать путаницы, по которой указатель должен быть применен к какому объекту.
В верхней двойной петле, ...
Во-первых, c
-loop не повторяется, когда r==0
, и, таким образом, вы получаете двойные символы новой строки ↵↵
.
Далее, вы получите еще один ↵
как раз перед c
-циклом, когда r==1
.
В нижнем двойном шлейфе ...
c
-loop не повторяется, когда r==0
, и, таким образом, вы получаете двойные символы новой строки ↵↵
. Таким образом, вы должны заменить минимальное значение от r
до 1
и избегать вывода символа новой строки при r==1
в нижнем двойном цикле следующим образом:
#include <iostream>
int main()
{
for (int r = 1; r <= 10; ++r)
{
for (int c = 0; c < r; ++c)
{
std::cout << "+";
}
std::cout << std::endl << std::endl;
}
for (int r = 10; r > 0; --r)
{
for (int c = 0; c < r; ++c)
{
std::cout << "+";
}
if(r != 1){
std::cout << std::endl << std::endl;
}
}
return 0;
}
Впервые мы вводим первый цикл r = 0
и для внутреннего цикла c=0
. В этом случае условие внутреннего цикла не выполняется, поэтому первое состояние только из двух endl
выполняется в начале и в конце внутреннего цикла. Для исправления необходимо поместить во второй цикл условие int c = 0; c <= r; c++
. в этой ситуации вам нужно исправить условие первого цикла на int r=0; r<10; r++
вы можете увидеть это для диаграммы циклов: for_loop_diagram
исправленный код:
[110 ]