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

Posted

tags:

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

我自己新建了一个类后怎样获取CDocument的指针呢
是个单文档应用程序

使用AfxGetApp()->GetMainWnd()获取到的不是view的指针,而是main frame的指针。需要再调用main frame的GetActiveView()函数来获取当前活动的view的指针。
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->GetMainWnd();
CXXXView *pView=(CXXXView *)pMain->GetActiveView();
CXXXDoc *pDoc = (CXXXDoc *)pView->GetDocument();

别忘了#include相应的main frame, view和doc的头文件。
参考技术A 单例模式。

class CDocument
private :

static CDocument* stInstance;

public :

static CDocument* getInstance()

if(CDocument::stInstance == null)

CDocument::stInstance=new CDocument();

return CDocument::stInstance();



.......................................................



然后任何地方就可以:
CDocument::getInstance()得到进程内唯一的对象指针。

注:如果CDocument类不能修改,就定义另外一个类,改改就行了。追问

不是这个意思
例如在
CTestView类可以调用GetDocument()函数
现在我新建了一个CMyClass类
怎么获取CTestDoc的指针呢
CTestDoc *doc=((CTestView*)AfxGetApp()->GetMainWnd())->GetDocument();
为什么要出错

追答

……这个问题描述得…………。实在看不懂。
出错?什么错?是告诉GEtDocument()方法不能调用?

只能猜了,检查函数的权限是不是public。或者看看是不是被定义友元。

参考技术B CDocument * pt = new CDocument;

就这样 定义一个指针 pt 指向 CDocument 类;

将 C++ 结构指针从一个类传递到另一个类

【中文标题】将 C++ 结构指针从一个类传递到另一个类【英文标题】:Pass a C++ struct pointer from one class to another one 【发布时间】:2015-04-10 14:43:03 【问题描述】:

我有两个不同的类(class1 class2),它们都有自己的头文件和 cpp 文件。 Class2 包含了 class1 的标题。 Class1 有两个公开的结构。 我想从 class1 中的 class2 调用一个方法,并传递两个指向结构的指针。

class1 中class2 的方法调用。 (obj是class1中class2的对象):

obj.routine(ip_s.c_str(), &NLP_data_recv, &recv_data_data); //write to harddrive

在 class2 中声明方法之后:

int routine(std::string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data);

出现以下错误:

 “argument of type ""com::NLP_data_data_package *"" is incompatible with    parameter of type ""NLP_data_data_package *"" 

我该如何解决这个问题?谢谢。

编辑:附加代码:

类com头(class1):

#ifndef COM_H 
#define COM_H 
//... 
#include "Dateiverwaltung.h" 
//... 

class com 
 
private: 

Dateiverwaltung obj; 
//... 
public: 

int run(void); 
com(std::array<std::string,TWO> socket); 
~com(); 

struct NLP_data_header_package 
 
//... 
NLP_data_recv; 

struct NLP_data_data_package 
 
//... 
recv_data_data; 

类 com cpp (class1)

//... 
if (recv_command == DATA_COMMAND) 
      
         obj.routine(ip_s.c_str(), &NLP_data_recv, &recv_data_data); //write to harddrive 
         obj.ext_close_file(); 
      
//...

类 Dateiverwaltung 标头(class2)

#ifndef DATEIVERWALTUNG_H 
#define DATEIVERWALTUNG_H 

//... 
#include "communication.h" 
//... 
public: 
Dateiverwaltung(char* directory_global_re); 
~Dateiverwaltung();   

 int routine(std::string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data); 
 int ext_close_file(void); 
//...

类 Dateiverwaltung cpp (class2)

//... 
int Dateiverwaltung::routine(string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data) 
 
//...

【问题讨论】:

在类com 之外,其中定义的结构称为com::NLP_data_data_package,而struct NLP_data_data_package 指的是不同的类型(您尚未定义的类型)。而且 C++ 不需要结构类型上的“struct”-warts,您只需使用名称本身即可。 不幸的是它不是那样工作的。我收到以下错误消息:错误 c2653“com”不是类或命名空间名称。好吧,实际上它是一个类,但它不起作用。 您是否碰巧在两个不同的地方有两个名为“NLP_data_data_package”的结构定义?我认为这个问题需要更多的代码和更少的散文。 不,我只有一个定义,只是在所有文件中用 strg+f 检查了它 从参数中去掉“struct”,你可能会得到更丰富的错误信息, 【参考方案1】:

错误提示存在“com::NLP_data_data_package” 和一个“NLP_data_data_package”

这是两个不同的类(对于编译器),因为它们似乎是在不同的命名空间中定义的,即 com 和默认命名空间。

【讨论】:

结构 NLP_data_data_package 在第一个类(com 类)中定义,但在将其作为指向第二类的指针传递后,我收到此错误消息。我不明白如何解决这个问题。

以上是关于c++ 怎样从任意类获取CDocument类指针的主要内容,如果未能解决你的问题,请参考以下文章

在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等

C++ 字符串 - 如何避免获取无效指针?

在c语言中怎样用c++类中的对象调用c++类中的方法?

C++ 多态静态可变子函数指针

C++ 指向类的指针

c ++如何获取指向另一个类中的当前对象的指针?