c++类的成员函数返回在类中定义的结构体的问题

我写了一个类,在类的头文件中定义了一个结构体,在类的实现中对结构体进行了操作,然后我留了一个接口,用于获取类中定义的结构体的值,但是这个接口函数在返回结构体时报错了,我是个小白,看了半天不知道哪儿出错了,想请教一下各位大佬,麻烦给我答疑,谢谢!
这是头文件
图片说明
这是头文件的实现

1个回答

1.将 struct header结构体的申明放于类使用该结构体之前;
2.可以使用 typedef struct header{ }Header;简化使用名称

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++类的成员函数返回在类中定义的结构体的问题
我写了一个类,在类的头文件中定义了一个结构体,在类的实现中对结构体进行了操作,然后我留了一个接口,用于获取类中定义的结构体的值,但是这个接口函数在返回结构体时报错了,我是个小白,看了半天不知道哪儿出错了,想请教一下各位大佬,麻烦给我答疑,谢谢! 这是头文件 ![图片说明](https://img-ask.csdn.net/upload/201907/21/1563697402_605751.png) 这是头文件的实现
c++类的成员函数返回结构体的问题
我写了一个类,在类的头文件中定义了一个结构体,在类的实现中对结构体进行了操作,然后我留了一个接口,用于获取类中定义的结构体的值,但是这个接口函数在返回结构体时报错了,我是个小白,看了半天不知道哪儿出错了,想请教一下各位大佬,麻烦给我答疑,谢谢!(之前发过一次,一张图片没传上来) 这是头文件![图片说明](https://img-ask.csdn.net/upload/201907/21/1563697696_467931.png) 这是头文件的实现 ![图片说明](https://img-ask.csdn.net/upload/201907/21/1563697714_537410.png) 主要就是返回结构体那个函数有问题,Qt提示是: analyze.cpp:109:24: error: incomplete result type 'struct Header' in function definition analyze.h:15:12: note: forward declaration of 'Header' analyze.cpp:110:13: error: no viable conversion from 'Analyze::Header' to incomplete type 'struct Header' analyze.h:15:12: note: forward declaration of 'Header' 我查了半天也没有查出所以然来
c++通过成员函数指针 跨DLL回调的问题
最近写了个项目,里面遇到了一个函数跨模块回调的问题,由于项目本身比较复杂,所以简化了一下,但是还是能反映问题的。 问题大致是这样: 我从主程序(exe)中调用一个DLL(称为D)中的类,这个类又调用另一个DLL(称为B)中的类,在每一级的调用之前都已经传入了一个函数指针, 在B执行完之后通过回调返回到上一个DLL(D),然后再通过回调最后返回到主程序。但是在从B返回到D之后,D的数据好像变了,导致D最终无法返回主程序。 更具体一点: D是依赖于B的,而主程序对B和D都依赖。 回调我是通过类的成员函数指针: ``` typedef void(Object::*CallBack)(...); ``` 通过一个结构体来保存函数指针和该函数所属的对象。 ``` typedef struct { Object* object; CallBack method; } EventHandler; ``` 代码片段在这里: https://code.csdn.net/snippets/693435 项目地址: https://code.csdn.net/jomoonrain2/c-lab 我觉得最有问题是我定义的这个函数指针。 但是问题是如果我没有跨DLL的话,貌似这样是没问题的。我知道跨模块调用应该挺复杂,虽然可以想其他的办法,但是这个问题如果搞不明白,吃饭都不香。。。 希望各路高手不嫌弃我这仅有的60币,不吝赐教。
C++编程新手求解:结构体与数组问题?
``` #include <iostream> using namespace std; struct bits1 //位域结构体 { unsigned char a : 1; //整数范围0~1 unsigned char b : 3; //整数范围0~7 unsigned char c : 4; //整数范围0~15 }; struct bits2 { unsigned short a : 1; //整数范围0~1 unsigned short b : 3; //整数范围0~7 unsigned short c : 4; //整数范围0~15 }; void main( ) { cout << "bits1: " << sizeof (bits1)*8 << endl; cout << "bits2: " << sizeof (bits2)*8 << endl; bits2 bit, *pbit = &bit; //定义结构体指针 bit.a = 1; bit.b = 7; bit.c = 15; cout << bit.a << " " << bit.b << " " << bit.c << endl; pbit->a = 0; pbit->b = 0; pbit->c = 0; //指针访问成员 cout << pbit->a << " " << pbit->b << " " << pbit->c << endl; system("pause"); } ``` 请对上面的程序作出以下修改: (1)写一个输出函数,输出各个data,使其不在main 中输出。函数原型为: void showNodeData( NODE *head ) ; (2)写一个逆序输出函数,以逆序输出各个NODE 的data 值。函数原型为: void reverseShowNodeData( NODE *head ) ;如果需要额外空间,请在本函数中动态分配及释放。 (3)写一个均值函数,计算各个data 的均值并返回。函数原型为:double averageNodeData( NODE *head ) ; (4)写一个查找函数,在各个data 中查找某个值KEY。函数原型为:NODE * searchNodeData( NODE *head, int KEY ) ;如果找到了,返回该NODE 地址并输出data;如果没找到,返回NULL 指针。 (5)写一个插入函数,在第K 个位置插入一个newNODE。函数原型为: bool InsertNode( NODE *head, int K, NODE *newNODE ) ;在main 函数中为newNODE 分配空间并赋值data(data 值自定)。如果插入成功返回true,并输出各个data 以证明插入成功。失败返回false。插入成功、失败的条件是什么? (6)写一个删除函数,删除第K 个位置上的NODE。函数原型为:bool DelNode( NODE *head, int K ) ; 如果删除成功,释放该NODE 内存并返回true,输出各个data 以证明删除成功。如果删除失败,给出提示信息并返回false。 (7)原题new 分配的所有NODE 内存都没有释放,编一个释放函数,原型如下:void DelList( NODE *head ) ; C++新手求各路大神解答,定感恩不尽!
C++课程设计 求大神帮忙写下构造函数和析构函数
1.网格世界类 网格中每个元素存放各种生物对象的指针或者为空。模拟过程中,我们需要移动生物,还有繁殖和饥饿(死亡),所以在网格类中,我们可以将一只生物放到网格中;可以读取网格中的某个指定位置的生物,获取它的指针,以便在每一个time step中对它进行处理(移动、繁殖和饥饿死亡)。在一个time step中,网格中每只生物都要处理一遍,先狮蚁,后蚂蚁。另外,应该有一个显示网格的成员函数。 2.有机生物类 生物要能够放到网格中,所以每一只生物都有相关的函数。可以是构造函数,即构造生物的时候,同时指明放到网格的哪一个位置上。 有Move函数,Breed函数,Starve函数(是否饿死)。这些函数在派生类中有派生类自己的实现。所以,在有机生物类中,这些函数应该是纯虚函数,有机生物类是一个抽象类。 网格世界类中,从某个网格位置读取生物并处理时,需要知道是哪一种类型的生物(是狮蚁还是蚂蚁),所以,有机生物类里应该考虑如何返回生物的类型。简单的办法是,用不同的常量来表示狮蚁和蚂蚁。例如,用整数1表示狮蚁,2表示蚂蚁。在有机生物类中定义纯虚函数GetType,返回生物的具体类型。 3.蚂蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 4.狮蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 (二)细化: 1.网格世界类: (1)属性。数据结构:网格世界中如何存放蚂蚁或狮蚁对象? 20*20的网格,用一个20*20的二维数组来表示,数组元素是什么类型? (2)方法。网格世界类应该有哪些成员函数? 构造函数:初始化网格。 析构函数:释放掉所有生物。 Set函数:指定x,y位置(二维数组的下标),以及一只生物的地址(指针),将这只生物存入网格中。 Get函数:获取网格中x,y坐标上的生物的地址(指针)。 OneStep函数:在一个time step中,网格中每只生物都要处理一遍,包括移动、繁殖和饥饿。首先,把网格中的每一只生物在本轮是否移动过的标记moved先都标记为假(为什么?);其次,移动,先狮蚁,后蚂蚁,同时把该生物的moved标记为真;再次,把饥饿的狮蚁消灭掉;最后,繁殖。 Display函数:显示函数,显示网格中的具体情况。每个网格,如果是空,显示”.”;如果是蚂蚁,显示”o”;如果是狮蚁,显示”x”。 2.有机生物类 (1)属性 要记录每只生物的一些基本属性:属于哪个网格对象,具体在哪个位置上(x,y坐标),本轮是否移动过。另外,为了记录是否到了繁殖时间,要有一个跟踪器,即记录上次繁殖之后,又经历了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的生物放到网格中。 析构函数: Move函数,Breed函数,Starve函数和GetType函数为纯虚函数。 3.蚂蚁类 (1)属性 不需要再添加属性。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的蚂蚁放到网格中。 析构函数: Move函数:随机选择一个方向,看是否能移动,否则保持在原位置。 Breed函数:繁殖跟踪器+1.如果是3的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:本模拟中蚂蚁不会饿死,所以仅返回false值即可。 GetType函数:返回蚂蚁的类型标记。 4.狮蚁类 (1)属性 狮蚁会饿死,需要添加一个属性,跟踪记录狮蚁饥饿了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的狮蚁放到网格中。 析构函数: Move函数:若有相邻蚂蚁,移动到单元网格,吃掉蚂蚁;否则,随机选择一个方向,看是否能移动,不能移动则保持在原位置。 Breed函数:繁殖跟踪器+1,如果是8的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:饥饿跟踪器+1,如果是3的倍数,则饥饿并死亡,从网格中拿掉该狮蚁,同时跟踪器清零。 GetType函数:返回狮蚁的类型标记。 四、其它 (一)所有涉及的常量定义为类型常量。如: const int ANTBREED = 3; //蚂蚁的繁殖周期为3个time steps const int DOODLEBREED = 8; //狮蚁的繁殖周期为8个time steps 初始化网格世界时,用的狮蚁只数和蚂蚁只数,分别为5只和100只,也定义为类型常量。如: const int INITIALANTS = 100; const int INITIALBUGS = 5;
返回自定义对象时的异常
#include <iostream> #include <string> #include <vector> using namespace std; class listOperateion{ private: string * a; string * b; string pattern; public: listOperateion(){} void setList1(string * a){ this->a = a; } void setList2(string * b){ this->b = b; } string* getList1(){ return this->a; } string* getList2(){ return this->b; } static vector<string> split(string str,string pattern) { string::size_type pos; vector<string> result; str+=pattern; int size=str.size(); for(int i=0; i<size; i++) { pos=str.find(pattern,i); if(pos<size) { string s=str.substr(i,pos-i); result.push_back(s); i=pos+pattern.size()-1; } } return result; } static OutputData elementSplit( string str ) { OutputData od; vector<string> result = split(str,","); //cout<<"the result:"<<endl; int vsize = result.size(); string *str1 = new string[vsize](); for(int i=0; i<result.size(); i++) { str1[i] = result[i]; //cout<<str1[i]<<endl; } od.setA(str1); od.setB(vsize); return od; } string* dataInput() { string a; char ch1[100]; scanf("%[^\n]", ch1); a = ch1; OutputData od ; od = elementSplit(a); string *str2 = od.getA(); int vsize = od.getB(); setList1(str2); /*for (int i=0;i<vsize;i++) { cout<<str2[i]; }*/ return str2; } }; class OutputData{ private: string * a ; int b; public: OutputData(){} void setA(string * a){ this->a = a; } string* getA(){ return this->a; } void setB(int b){ this->b = b; } int getB(){ return this->b; } ~OutputData(){} }; void main(){ listOperateion lo; lo.dataInput(); string * a = lo.getList1(); /*for (int i=0;i<a->length();i++) { cout<<a[i]; }*/ } 异常: 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(51): error C2146: 语法错误: 缺少“;”(在标识符“elementSplit”的前面) 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(51): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(51): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(52): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(66): warning C4183: “elementSplit”: 缺少返回类型;假定为返回“int”的成员函数 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(41): warning C4018: “<”: 有符号/无符号不匹配 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(53): error C2146: 语法错误: 缺少“;”(在标识符“od”的前面) 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(53): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(58): warning C4018: “<”: 有符号/无符号不匹配 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(63): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(63): error C2228: “.setA”的左边必须有类/结构/联合 1> 类型是“'unknown-type'” 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(64): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(64): error C2228: “.setB”的左边必须有类/结构/联合 1> 类型是“'unknown-type'” 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(65): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(76): error C2146: 语法错误: 缺少“;”(在标识符“od”的前面) 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(76): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(77): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(78): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(78): error C2228: “.getA”的左边必须有类/结构/联合 1> 类型是“'unknown-type'” 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(79): error C2065: “od”: 未声明的标识符 1>e:\vs2010\newproject\crapt01\crapt01\t01.cpp(79): error C2228: “.getB”的左边必须有类/结构/联合 1> 类型是“'unknown-type'” c++新手**
WM_WINDOWPOSCHANGING消息中的WINDOWPOS->flags成员怎么清除相应位SWP_DRAWFRAME???
**WM_WINDOWPOSCHANGING消息备注:** 对于具有WS_OVERLAPPED或WS_THICKFRAME样式的窗口,DefWindowProc函数将WM_GETMINMAXINFO消息发送到窗口。 这样做是为了验证窗口的新大小和位置,并强制执行CS_BYTEALIGNCLIENT和CS_BYTEALIGNWINDOW客户端样式。 通过不将WM_WINDOWPOSCHANGING消息传递给DefWindowProc函数,应用程序可以覆盖这些默认值。 在处理此消息时,修改WINDOWPOS中的任何值会影响窗口在Z顺序中的新大小,位置或位置。应用程序可以通过设置或清除WINDOWPOS的flags成员中的相应位来阻止对窗口的更改。 **WINDOWPOS结构成员flags描述** flags 类型:UINT 该成员可以是以下一个或多个值。 值 含义 SWP_DRAWFRAME 0×0020 在窗口周围绘制一个框架(在窗口的类描述中定义)。与SWP_FRAMECHANGED标志相同。 SWP_FRAMECHANGED 0×0020 即使窗口的大小未更改,也会向窗口 发送WM_NCCALCSIZE消息。如果未指定此标志,则仅在更改窗口大小时发送WM_NCCALCSIZE。 ``` case WM_NCCALCSIZE:return 0; case WM_WINDOWPOSCHANGING: { WINDOWPOS *pos = (LPWINDOWPOS)lParam; pos->flags;//怎么清除相应位SWP_DRAWFRAME??? return 0; } ``` WM_NCCALCSIZE消息返回0后可以无边框,但是最大化时会发生位移 不正常(-8, -8)-(1374, 776), 1382x784 (最大化) 正常(0,0)-(1366,768)(最大化) 清除相应位SWP_DRAWFRAME后应该就可以实现正常,但怎么实现???
窗口类应用程序已经编译成功,为什么显示一直在连接,就是没有界面出来,是什么问题
``` #include<windows.h> #include<stdio.h> //声明窗口过程函数 LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); //编写WinMain函数 int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )//注意没有冒号 { //设计窗口类,给所有成员赋值 WNDCLASS wndcls;//WNDCLASS 为窗口类名,wndcls为窗口类对象,接下来为WNDCLASS里的每一个成员赋值 wndcls.cbWndExtra =0; wndcls.cbClsExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//用GetStockObject这个函数从库里选择一个黑色的现成的黑色画刷 wndcls.hCursor =LoadCursor(NULL,IDI_ERROR);//用这个函数从库里获取一个图标,前参数为句柄,后者是句柄类型 wndcls.hInstance =hInstance;//WinMain函数里有个当前应用程序句柄,当调用WinMain函数是,它就会传过来一个应用程序句柄 wndcls.lpfnWndProc =WinSunProc;//将窗口过程函数的名字赋给他,因为函数的名字就是一个指针(地址),注意不是窗口类的名字 wndcls.lpszClassName ="liquanfu2009"; wndcls.lpszMenuName =NULL; wndcls.style =CS_HREDRAW|CS_VREDRAW; //注册窗口类 RegisterClass(&wndcls);//用RegisterClass这个函数注册,将设计的窗口类的对象Wndcls的地址传给这个函数 //创建窗口 HWND hwnd; hwnd=CreateWindow("liquanfu2009","我的窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//WS_OVERLAPPWDWINDOW是要显示的窗口的样式 //显示窗口 ShowWindow(hwnd,SW_SHOWNORMAL);//SW_SHOWNORMAL是显示的方式 //更新窗口 UpdateWindow(hwnd); //消息循环 MSG msg; while(GetMessage(&