如果获取类的指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果获取类的指针相关的知识,希望对你有一定的参考价值。

IMPLEMENT_DYNCREATE(CSplitterView, CView)

CSplitterView::CSplitterView()



CSplitterView::~CSplitterView()



BEGIN_MESSAGE_MAP(CSplitterView, CView)
//AFX_MSG_MAP(CSplitterView)
ON_WM_CREATE()
ON_WM_SIZE()
//AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSplitterView drawing

void CSplitterView::OnDraw(CDC* pDC)

CDocument* pDoc = GetDocument();
// TODO: add draw code here


/////////////////////////////////////////////////////////////////////////////
// CSplitterView diagnostics

#ifdef _DEBUG
void CSplitterView::AssertValid() const

CView::AssertValid();


void CSplitterView::Dump(CDumpContext& dc) const

CView::Dump(dc);

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSplitterView message handlers

int CSplitterView::OnCreate(LPCREATESTRUCT lpCreateStruct)

if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here

m_wndSplitter.CreateStatic(this, 2, 1);

CCreateContext *pContext = (CCreateContext*) lpCreateStruct->lpCreateParams;

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CListCtrlView1), CSize(100,100), pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CEditCtrlView1), CSize(100,100), pContext);

//CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;
m_pSplitterView = (CSplitterView*) m_wndSplitter.GetActivePane(0,0);//???????????????????????????????

CSplitterView* m_pSplitterView;

m_pSplitterView这个指针应该如何正确获取呢,在线等~~~~
m_pSplitterView = this;

m_pEditCtrlView = (CEditCtrlView1*) m_wndSplitter.GetPane(1,0);这样获取了指针,
class CLeftView : public CTreeView在这个类里面,m_pSplitterView->m_pEditCtrlView->Show(iFlag);想这样调用函数,不对,怎么办呢???

你现在在RightView里头new是不对的,因为RightView看不到LeftView
所以只能在RightView和LeftView的上一级单位里new,一new完就分别传给RightView和LeftView
这就不会错了。
假设LV和RV是PV
PV有一个member是RV rv; LV lv;(或者指针)
RV类增加一个member LV* plv;
===>改一下,RV类增加一个member PV* ppv;

PV里,rv.ppv=this
在RV的new之后就可以ppv->lv->m_SlipView=XXXXX
参考技术A m_pSplitterView = this;

m_wndSplitter 是 CSplitterView 的子控件
然后, CListCtrlView1 , CEditCtrlView1 又是 m_wndSplitter 管理的2个子控件。

你到底要得到那个指针呢?m_pSplitterView想保存在哪儿?
参考技术B 你 定义的是 CSplitterView* m_pSplitterView;
放在 CSplitterView::OnCreate() 里 m_pSplitterView = this;

CSplitterView* m_pSplitterView; 这个定义要放在外部
参考技术C GetActivePane的两个参数,第一个表示行,第二个表示列,在使用GetActivePane想获得你要View时,主要看你的View是如何排列的了,写好行列值就可以了,这个行列值是左上角为0,0,向右行加1,向左列加1,你试试就知道了。

使用指向类的指针调用成员函数时获取 System.AccessViolationException

【中文标题】使用指向类的指针调用成员函数时获取 System.AccessViolationException【英文标题】:Getting System.AccessViolationException while calling a memberfunction using pointer to a class 【发布时间】:2013-01-09 04:28:12 【问题描述】:
using namespace std;

class Layer

protected:
    Layer *lower;
    Layer *upper;
public:
    Layer(Layer *lo,Layer *up):lower(lo),upper(up)
    
    virtual void send()=0;
    virtual void receive()=0;
;
class Physical_Layer:public Layer

public:
    Physical_Layer(Layer *p):Layer(NULL,p)
    
        cout<<"Physical_Layer constructed"<<endl;
    
    virtual void send()
    
        cout<<"Data send from Physical_Layer"<<endl;
        receive();
    
    virtual void receive()
    
        cout<<"Physical_Layer calling receive of DataLink_Layer"<<endl;
        upper->receive();
    
;
class DataLink_Layer:public Layer

public:
    DataLink_Layer(Layer *p):Layer(new Physical_Layer(this),p)
    
        cout<<"DataLink_Layer Constructed"<<endl;
        lower->send();
    
    virtual void send()
    
        cout<<"Data send from DataLink_Layer"<<endl;
        lower->send();
    
    virtual void receive()
    
        cout<<"DataLink_Layer calling receive of Application_Layer"<<endl;
        cout<<typeid(upper).name()<<endl;



        upper->receive();



    
;
class Application_Layer:public Layer

public:
    Application_Layer():Layer(new DataLink_Layer(this),NULL)
    
        cout<<"Application_Layer Constructed"<<endl;
        send();
    
    virtual void send()
    
        cout<<"Sending data from Application_Layer"<<endl;
        lower->send();
    
    virtual void receive()
    
        cout<<"Receiving data at Application_Layer"<<endl;
    
;

int main()

    Layer *l=new Application_Layer();

我试图使用协议设计模式来模拟三层协议栈。但是,在取消引用 DataLink_Layer 接收中的上层->接收时,我得到了一个运行时异常:System.AccessViolationException。为什么我会得到它?

【问题讨论】:

【参考方案1】:

DataLink_Layer 的构造函数试图在 Application_Layer 的基类 Layer 甚至构造之前通过 Layer* 回调到 Application_Layer(此时您仍在评估 new DataLink_Layer(this) )。

只需在DataLink_Layer 构造函数中调用upper-&gt;receive() 即可更清楚地看到这一点。

这个FAQ 解释了更多关于在构造函数中使用this

这个更简单的例子可能更清楚地说明了这个问题:

struct C;
struct A

    A(C* c) ;
    virtual void Foo() = 0;
;

struct C

    C(A* a)
    
        a->Foo();
    
;

struct B : public A

    B() : A(new C(this)) 
    void Foo() 
;

int main()

    B b;

一般来说,您不应该使用构造函数对部分构造的对象执行复杂的调用堆栈。只需在构造后显式调用send()receive() 函数即可。

【讨论】:

但是.. 当我从 Physical_layer 的接收函数中调用 DataLink_Layer 的接收函数时,它工作正常。 直到lower-&gt;send() 在DataLink_Layer 构造函数中被调用,此时DataLink_LayerLayer 基类已经被构造,你才能调用它。 除了显式调用发送和接收之外,还有其他方法吗?场景就像我应该在连接建立期间发送一个特定的数据帧。所以我正在考虑使用构造函数来完成这项工作。 @sajas 构造不应该真正用于像发送数据帧这样的繁重工作,尤其是不能像这样复杂的继承。我没有看到其他方式。 感谢您的回答。我还有 1 个问题。当我将 Layer 类(下层和上层)中的属性作为每个派生层的私有变量并尝试使用这些属性调用虚拟函数时,我能够做到这一点。然后调用正确的虚函数。根据您提供的常见问题解答链接,这应该发生吗?

以上是关于如果获取类的指针的主要内容,如果未能解决你的问题,请参考以下文章

使用指向类的指针调用成员函数时获取 System.AccessViolationException

如何在多线程函数MFC中获取对话框类的指针

获取没有对象的类的vtable

c++ 怎样从任意类获取CDocument类指针

获取 Qt 对象的大小

如何获得指向类的复制构造函数的成员函数指针?