2012-04-18 7 views
0

Во-первых: Я знаю, что мой вопрос касается не родительского класса, но я не знаю, как называется эта структура, и я думал, что родитель будет проще всего описать его.метод вызова из родительского класса

У меня есть два класса, определенные как это:

class class_a { 
    void foo() { 
     //stuff 
    } 
}; 

class class_b { 
    class_a A; 
    void foo() { 
     //more stuff 
    } 
}; 

Я хочу class_b :: Foo(); когда определенные требования выполняются в class_a :: foo(); Можно просто установить переменную в class_a и проверить ее в class_b :: foo(); но мне было интересно, есть ли более элегантное решение для этого.

примечание: class_b является и не может быть выведено из класса_a.

+1

Почему бы просто не использовать локальную переменную в class_b :: Foo ()? –

+1

Как насчет сохранения указателя функции на основе «определенных требований»? – Nick

+2

хотя есть обходные пути для достижения такого поведения, это пахнет плохим дизайном .. что вы действительно пытаетесь сделать? –

ответ

1

Не уверен, что я полностью понимаю, что вы пытаетесь сделать, более конкретный пример, было бы полезно, но, возможно, это делает то, что вы хотите:

class class_b; 

class class_a { 
    void foo(class_b* b); 
}; 

class class_b { 
    class_a A; 
    void foo() { 
     A.foo(this); 
    } 
    void foo_impl() { 
     // stuff based on requirements in a::foo 
    } 
}; 

void class_a::foo(class_b* b) { 
    //stuff 
    if (conditionsMet()) { 
     b->foo_impl(); 
    } 
} 
+0

Я думаю, что ближе всего к тому, чего я пытаюсь достичь. Спасибо :) – Kevin

0

Одна вещь, которую вы можете сделать, это создать третий класс, который абстрагирует это поведение, независимо от того, происходит ли оно от обоих или просто независим.

0

Для терминологии class_bсодержит или владеет экземпляр class_a.

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

Смежные вопросы