2011-05-19 179 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 2011-05-19 11:56:03

回答

2

你可以使用一些被称为虚函数的东西。顺便说一下,你的语法是可怕的,它不是而是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++,所以我打算以C的方式来做。 它仍然不能解决我的问题,因为在你的例子中类A具有2个实际上相同的函数,称为真函数和虚函数,这就是问题出现的地方,如果我可以给函数一个指针而不是真正在func中指定一个名字A&a)它会被解决。 – 2011-05-21 10:16:45

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. 要使用覆盖(例如派生类中的不同impl),必须使用virtual函数。

但我宁愿重新考虑你的设计...

+0

干净的代码有效。虽然我没有尝试编码,但C++模板似乎对我来说是正确的方法。 – hackworks 2011-05-19 12:42:20

+0

关于我的设计的重新思考:可能只是为了让我有一个if if else和else,因为我只有3个成员函数作为选项(但名称不同,可悲的是,看到A类有1个名称和B类有2个其他名称,但结果相似)!但我只是好奇它是否可以按照我所要求的方式完成,因为我来自C编码,在这里很容易 – 2011-05-21 10:32:24