2011-05-19 3 views
0

Я хочу вызвать функцию-член другого класса на объекте, но я не могу понять, как это работает. Как пример кода о том, как он должен работать:Указатели функций класса в C++

Class A { 
    void somefunction(int x); 
} 

Class B : A { 
    void someotherfunction(int x); 
} 

Class C { 
    void x() { 
     callY(&ofthefunction); 
} //here you call the function, you dont have an object yet, and you don't know the argument yet, this will be found in function callY 

    void Y(*thefunction) { 
     find int x; 
     if(something) 
      A a = find a; 
      a->thefunction(x); 
     else 
      B b = find b; 
      b->thefunction(x); 
} 
} 

Я надеюсь, что это делает Sence, можно также разделить это в 2-х методов, Y1 и Y2, но видя, как 90% кода то же самое (найти вещи в файле XML), только объект и аргумент, где его сохранить, различны, я бы хотел это сделать

+1

Вы надеетесь, что имеет смысл? Нет, нет. Опубликовать по крайней мере компилируемый код. Что мы должны предполагать о вашем знании C++, если ваш код даже не компилируется, с таким количеством синтаксических ошибок и всего? – Nawaz

ответ

2

Вы можете использовать что-то известное как виртуальная функция. Кстати, ваш синтаксис отвратительный, это class не Class, вам нужны фигурные скобки для ваших условностей и разумное приложение public, некоторые дополнительные точки с запятой и т. Д. Было бы полезно, если бы вы приблизились к компилятору, прежде чем приходить сюда, y «знают.

class A { 
public: 
    virtual void somefunction(int x); 
}; 

class B : public A { 
public: 
    virtual void somefunction(int x); 
}; 

void func(A& a) { 
    int x = 0; 
    // Do something to find x 
    a.somefunction(x); 
    // calls A::somefunction if this refers to an A 
    // or B::somefunction if it's a B 
} 
int main() { 
    A a; 
    func(a); // calls A::somefunction 
    B b; 
    func(b); // calls B::somefunction 
} 
+0

Прошу прощения, я пытался писать псевдокод, а не код C++. Может быть, я пытаюсь сделать это слишком сложным, дело в том, что у меня есть только уроки C в школе, а не на C++, поэтому я стараюсь сделать это как можно скорее. Это все равно не решит мою проблему, поскольку класс A в вашем примере имеет две практически идентичные функции, называемые truefunction и falsefunction, вот где возникает проблема, если я могу дать указатель на функцию вместо фактического указания имени в func (A & a), это было бы решено. –

0

Нет, это не сработает. Указатель на элемент A всегда укажет на эту функцию, даже если он вызван B, потому что B наследуется от A.

Вам нужно использовать виртуальные функции. Я вижу, что DeadMG избил меня.

1

Что вы хотите сделать может быть сделано, хотя я woudn't решить это следующим образом:

class A { 
public: 
    virtual int doit(int x) { return x+1; } 
}; 

class B : public A { 
public: 
    int doit2(int x) { return x*3; } 
    int doit(int x) { return x*2; } 
}; 

int foo(int (A::*func)(int), int x, bool usea) { 
    if (usea) { 
     A a; 
     return (a.*func)(x); 
    } else { 
     B b; 
     return (b.*func)(x); 
    } 
} 

int main() { 
    int (A::*bla)(int) = &A::doit; 
    foo(bla, 3, true); 
    foo(bla, 3, false); 

} 

Однако для этой работы, следующее должно быть удовлетворено:

  1. Вы должны использовать указатели функций базового класса (например, int (A::*bla)(int)), иначе вы не сможете вызвать его в этом базовом классе (например, int (B::*bla)(int) может использоваться только на B экземплярах, а не на A экземплярах, даже если метод уже определен в A).
  2. Методы должны иметь те же имена, что и в базовом классе
  3. Чтобы использовать переопределение (например, разный имп в производном классе), вы должны использовать функции virtual.

Но я предпочел бы пересмотреть свой дизайн ...

+0

Хороший чистый код, который работает. Хотя я не пробовал кодировать его, C++-шаблоны, по-видимому, являются правильным подходом ко мне. – hackworks

+0

О переосмыслении моего дизайна: можно было бы просто сделать так, чтобы у меня было if else if и else, потому что у меня есть только 3 функции-члена как опции (но с разными именами, к сожалению, видя, что класс A имеет 1 имя и класс B имеют 2 других имени, но с аналогичными результатами)! Но мне было просто любопытно, можно ли это сделать так, как я прошу, потому что я пришел из C-кода, где это было бы легко –

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