webbrowserview是我定义的视图,继承自CHtmlView,默认的,构造函数是保护类的。我需要在CMainframe下的一个函数中
调用Navigate函数,它好像是CHtmlView的虚函数,我的webbrowserview下的保护函数OnRefresh()可以调用它的,但是
我现在希望mainframe下的函数能够调用Navigate函数,或者OnRefresh函数,但是由于webbrowserview的构造函数是保护
类的,所以,在mainframe下,webbrowserview a;a.OnRefresh();这样也不可以,所以,我在browserview下的共有定义了
view,就是标号1的地方,结果报错如下:
error C2460: 'view' : uses 'CWebbrowserView', which is being defined
webbrowserview.h(14) : see declaration of 'CWebbrowserView'
class CWebbrowserView : public CHtmlView
{
protected: // create from serialization only
CWebbrowserView();
DECLARE_DYNCREATE(CWebbrowserView)// Attributes
public:
CWebbrowserDoc* GetDocument();
CWebbrowserView view;---------------(1)
问题1:这是为什么?为什么报错,还有,报的错是什么意思?which is being defined ,什么意思?
问题2:我想在CMainframe下的一个函数中调用Navigate函数或者OnRefresh函数,具体怎么做?

解决方案 »

  1.   

    这问题与虚函数没有关系。1、类中不能定义本身类型的成员变量。
    2、视图是动态创建的,构造函数是保护类型的用意就是不让你这样构造,你在创建单文档项目的最后一步时,指定你的View继承自CHtmlView就可以了,程序会自动创建你定义的视图,在你的视图类初始化时可以调用你想要调的函数。
      

  2.   

    谢谢你回答的问题1,挺正确的,我会记住的。
    但是你还没有回答我的问题2,那具体怎么在mainframe中调用navigate函数呢?
      

  3.   

    ((webbrowserview*)GetActiveView())->navigate(……
      

  4.   

    虚函数需要从开始定义它的那层类开始调用才可以,你必须强制类型转换到WebBwoerView才行
      

  5.   


    照你的方法试了试,结果报错;
    'OnRefresh' : is not a member of 'CView'
     microsoft visual studio\vc98\mfc\include\afxwin.h(3542) : see declaration of 'CView'换成navigete,也报一样的错,它是chtmlview的虚函数,OnRefresh是webbrowserview的保护类成员
      

  6.   

    你的webbrowserview不是继承自CHtmlView吧?或者你没有按我贴的代码来写,否则navigete(应该是Navigate)是不会出错的。
    OnRefresh是你定义的保护函数,如果要在CMainFrame中调用,必须声明友员才行。
      

  7.   

    webbrowserview是继承自CHtmlView,看一楼的声明就能知道。
    我也按照你说的贴了,的确是不行啊。
    不过还是要谢谢你这么热心。
      

  8.   

    按我贴的代码来写,错误信息中怎么可能说is not a member of 'CView'
      

  9.   

    看了你的代码了,你就是没完全按照我说的来写。
    我说的是:((CWebbrowserView*)GetActiveView())->Navigate
    你写成了:(CWebbrowserView*)GetActiveView()->Navigate->操作符的优先级高于强制类型转换。
      

  10.   

    ((CWebbrowserView*)GetActiveView())->Navigate 这样是能行了,但是,Navigate是CHtmlview的公有函数,这样可以,但是我如果想调用CWebbrowserView的保护类函数OnRefresh呢?怎么办?
      

  11.   

    声明友元。如果你要在CMainFrame类中调用,就在CWebbrowserView的类定义中加入一行:
    friend class CMainFrame;
      

  12.   

    我觉得是再webview中的public下 再声明一个函数,包容OnRefresh,但这是最好的办法吗?
      

  13.   

    CWebbrowserView是你自己定义的,你可以把OnRefresh定义为public成员,我说的是从外部访问私有或保护成员的方法。
    顺便再提一下,这类函数是事件(消息)的响应函数,定义为虚函数是为了让子类可以重载此函数来响应事件;定义为保护成员是为了让子类重载后,在做完相应的处理后,可以调用基类的这个函数,所以不能定义为私有成员,而这个函数又不是提供给外部调用的,所以不能定义为公有成员。
      

  14.   

    我声明了友元类,然后在CMainframe下的函数中调用
    CWebbrowserView a;
    a.OnRefresh(); 一切OK,编译通过,但是在程序调用这个函数时,(已经顺利运行了),显示,该内存不能为读,然后关闭了,很郁闷。
      

  15.   

    照着调用上一个函数的方法啊!
    ((CWebbrowserView*)GetActiveView())->OnRefresh();
      

  16.   

    恩 我有点懂了 视图类下的函数 在其他类里面被调用 都要用GetActiveView(),不能直接CWebbrowserView a; 
    a.OnRefresh(); 是这样吗?
      

  17.   

    CWebbrowserView a; a.OnRefresh();这样的用法只有新构造一个类的实例时才有可能这样用。
    你需要把类和类的实例区分开。
    假设有一个类
    class c
    {
    public:
        int i;
    };
    定义了两个实例
    c c1, c2;
    c1.i和c2.i是不同变量,两个没有任何关联。
    在程序界面中显示的视图是在初始化时已经创建好了的视图类的实例,要对其操作你必须获得它的指针,GetActiveView函数就是获得当前活动视图的指针,用这个指针指向类的成员来操作。