求助,C#的委托类似于C++的委托,现在C++有一个回调函数,回调3个函数中的一个,但是3个函数参数不一样,C#用委托实现,但是参数必须一致

天心酥 2014-11-05 10:05:09
class B {
public:
virtual int Succeed(C* c, int delay, int load) = 0;
virtual int Fail(C * c, ErrorNo errorNo) = 0;
virtual int Complete() = 0;
};
class A{
public:
virtual ~A() {}
virtual int Start(C* c, size_t Count, B *fun, int seconds) = 0;
virtual int Stop() = 0;
};
ErrorNo 是枚举类型这里不贴出来了
B类里面放的是回调函数,这个是C++的接口函数,C++可以用函数指针实现回调,C#要实现的话要使用委托,
public delegate int MyDelegate(C c, int delay, int load, ErrorNo errorNo);其中C类的转换已完成,问题是原回调函数中的第一个回调函数返回值3个,后面的2个和没有,我的委托里面的参数到底该放几个,我写4个肯定不对,委托的参数必须和实现方法一致,现在不一致了,我该怎么去实现,求大神提供思路。
...全文
349 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 15 楼 u012456740 的回复:
还能详细一点吗?MyAction1这个proc的一个成员函数?需要定义成委托吗?
我只告诉你委托概念,你自己研究如何详细与c++交互的问题。
  • 打赏
  • 举报
回复
你传给它的委托应该放几个参数?它根本不管你传几个参数。比如说你可以写
        private static void t1()
        {

        }

        private static void t2(int a)
        {

        }

        private static void t3(string a, int b)
        {

        }

        private static string t4(int a)
        {
            throw new NotImplementedException();
        }
以及测试
    Delegate proc;
    proc = new Action(t1);
    proc = new Action<int>(t2);
    proc = new Action<string, int>(t3);
    proc = new Func<int, string>(t4);
你可以看到 proc 可以引用任何一个方法。这里都说了4种了,返回值也不同。 如果你说“我不知道 proc 应该给几个参数啊?”,这其实就是你没有使用委托的抽象造成的。
天心酥 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
在 .net 中是这样判断和使用委托类型对象的:
Delegate proc;

........
if (proc is MyAction1)
    ((MyAction1)proc)(......);
else if(proc is MyAction2)
    ((MyAction2)proc)(....);
还能详细一点吗?MyAction1这个proc的一个成员函数?需要定义成委托吗?
天心酥 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
在 .net 中是这样判断和使用委托类型对象的:
Delegate proc;

........
if (proc is MyAction1)
    ((MyAction1)proc)(......);
else if(proc is MyAction2)
    ((MyAction2)proc)(....);
非常感谢!
天心酥 2014-11-05
  • 打赏
  • 举报
回复
引用 11 楼 hdt 的回复:
[quote=引用 10 楼 u012456740 的回复:] 回复7#: 我切试试看。 回复9#: Start是个接口,具体实现我也不知道。
大致可以猜出来 void start(....) { swtich(count) { case 1: b::fun1(....); break; case 2: b:fun2(...) .... } }[/quote] 有什么方法帮我解决吗?有思路就好办。
  • 打赏
  • 举报
回复
在 .net 中是这样判断和使用委托类型对象的:
Delegate proc;

........
if (proc is MyAction1)
    ((MyAction1)proc)(......);
else if(proc is MyAction2)
    ((MyAction2)proc)(....);
真相重于对错 2014-11-05
  • 打赏
  • 举报
回复
引用 10 楼 u012456740 的回复:
回复7#: 我切试试看。 回复9#: Start是个接口,具体实现我也不知道。
大致可以猜出来 void start(....) { swtich(count) { case 1: b::fun1(....); break; case 2: b:fun2(...) .... } }
天心酥 2014-11-05
  • 打赏
  • 举报
回复
回复7#: 我切试试看。 回复9#: Start是个接口,具体实现我也不知道。
真相重于对错 2014-11-05
  • 打赏
  • 举报
回复
start 如何实现??
  • 打赏
  • 举报
回复
要是它觉得恶心,那就让他改接口呗,比如把B*换个类型
  • 打赏
  • 举报
回复
3个handler放在一个类里,C++里传B类的实例,那你也传B类的实例好了 让它自己去调吧 C++那么强,还有什么做不到的,把CLR寄宿到非托管程序中,调用CLR API反射调用B类的中方法 http://blog.csdn.net/begtostudy/article/details/6215972
天心酥 2014-11-05
  • 打赏
  • 举报
回复
回复3#: int delegate1(C c, int delay, int load) int delegate2(C c, ErrorNo errorNo) int delegate3(); 怎样把3个委托都绑定上,C#方调用Start( c, Count, XXX, seconds),XXX该怎么写,我该怎么传参过去?
天心酥 2014-11-05
  • 打赏
  • 举报
回复
B fun; A * p = CreateA();//这个函数有 p->AddRef(); p->Start(c, 3, &fun, 3000); C++直接传B类对象的地址进去然后就会找到自己想回调的函数,成功就调Succeed等等 C#delegate本身就类似于一个类,我不能再把他封装成类了,不知道传什么进去,1个回调有3中可能性,委托都不知道该怎么去弄。
真相重于对错 2014-11-05
  • 打赏
  • 举报
回复
c++ 函数指针转换也要求参数一致 c++是如何做的?
於黾 2014-11-05
  • 打赏
  • 举报
回复
把3个委托都绑定上 C++爱掉哪个就调哪个 不要企图用同一个回调来执行3个方法啊 那你知道该执行哪个方法吗
天心酥 2014-11-05
  • 打赏
  • 举报
回复
回复2楼: 问题是回调回来的函数是哪一个不确定啊,两个委托我要用哪个去接?
於黾 2014-11-05
  • 打赏
  • 举报
回复
重载2个委托
天心酥 2014-11-05
  • 打赏
  • 举报
回复
引用 18 楼 iyomumx 的回复:
先说清楚你是准备用C#调用C++的dll还是用C#重新实现一遍这个功能。 要在C#里使用C++的类十分困难,如果你对C++对象结构、调用约定和name mangling等内容十分熟悉倒是可以试试,否则还是推荐使用C++/CLI或C++重包装。 如果你要在C#里重新实现这个结构,那么注意A.Start要求传递一个B对象的指针,而在C#中B应该对应于一个抽象类或者接口,而不是一个委托。
我是要在C#中去实现,经过16楼的大神指导已经弄出来了,就像你说的在C#中B应该对应于一个抽象类或者接口,我一直当委托在弄,所以一直行不通,C++已经进行托管了,现在是在C#调的问题。谢谢
iyomumx 2014-11-05
  • 打赏
  • 举报
回复
先说清楚你是准备用C#调用C++的dll还是用C#重新实现一遍这个功能。 要在C#里使用C++的类十分困难,如果你对C++对象结构、调用约定和name mangling等内容十分熟悉倒是可以试试,否则还是推荐使用C++/CLI或C++重包装。 如果你要在C#里重新实现这个结构,那么注意A.Start要求传递一个B对象的指针,而在C#中B应该对应于一个抽象类或者接口,而不是一个委托。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧