急!新手求助:1,在MFC中,如何编写能返回指向自定义数据结构指针的函数? (注:原来的程序能在VC++ 2008运行) 2,如果换成引用又如何?

shuishoumiaomiao 2009-06-17 11:43:07
问题:1,在MFC中,如何编写能返回指向自定义数据结构指针的函数? ( 我的代码出现了5个错误!)
2,如果换成引用又如何?( 代码出现了1个错误!)
注:已经在出错的位置注上错误原因。
请各位多多指教!谢谢!
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以下是在VC++ 2008中可以运行的代码:
------------------------------------------------------
#pragma warning(disable:4786)
#include <string>
#include <iostream>
using namespace std;

#include <cstdlib>
#include <fstream>
using namespace std;

#include <cstring>
using namespace std;

struct Data
{
string name;
int age;
string work;
double account;
}

int main()
{
//打开输入文件并测试是否成功
string inputfilename;
cout << "Enter inputfilename for output: " << endl;
cin >> inputfilename;

ifstream lastins( inputfilename.c_str(), ios::in );

if ( !lastins )
{
cerr<< "*** ERROR: Cannot open for input. "<<endl;
return EXIT_FAILURE;
}

int Originallinecount = 2000;

//分配内存空间
Data* d = new Data[ Originallinecount ];

char middlestring[ 100 ];

//从文件中提取数据并放到自定义的结构数组中
if ( !lastins.eof() )
{
for ( int i = 0; i < Originallinecount; i++ )
{
lastins.get( middlestring, 100, '|' );
middlestring[ 99 ] = '\0';
d[ i ].name = middlestring;
lastins.ignore( 1, '|' );
......等等,均为数据提取
}
}

lastins.close();

//调用结构数组的数据...
{
}

delete[] d;

return 0;
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
在MFC中,我把上面的代码改为一个函数,代码如下:
-------------------------------------------------------------
在CView.h中加入:
------------------------------
#include <string>
using namespace std;

struct Data
{
string name;
int age;
string work;
double account;
}

// 提取文本文件的数据,并返回结构数组
Data* MakeDataArray(string inputfilename, int Originallinecount );

--------------------------------------------------------------------------------------------
在CView.cpp中加入:(注:已经在出错的位置注上错误原因)
---------------------------------------------------------

#include <fstream>
using std::ifstream;

#include <string>
using namespace std;

// 提取文本文件的数据,并返回结构数组
Data* CView::MakeDataArray(string inputfilename, int Originallinecount ) //错误1:error C2143: 语法错误 : 缺少“;”(在“*”的前面)
//错误2:error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

{ //错误3: error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
//错误4:error C2556: “int *CView::MakeDataArray(std::string,int)”: 重载函数与“CView::Data *CView::MakeDataArray(std::string,int)”只是在返回类型上不同
//错误5: error C2371: “CView::MakeDataArray”: 重定义;

//打开输入文件并测试是否成功
ifstream lastins( inputfilename.c_str(), ios::in );

if ( !lastins )
{
MessageBox( _T( "ERROR: Can not open the file"));
}

//分配内存空间
Data* d = new Data[ Originallinecount ];

char middlestring[ 100 ];

//从文件中提取数据并放到自定义的结构数组中
if ( !lastins.eof() )
{
for ( int i = 0; i < Originallinecount; i++ )
{
lastins.get( middlestring, 100, '|' );
middlestring[ 99 ] = '\0';
d[ i ].name = middlestring;
lastins.ignore( 1, '|' );
......等等,均为数据提取
}
}

lastins.close();

return *d;
}


void CView::RenderScene(void)
{
Data* datum = MakeDataArray( inputfilename, Originallinecount ); //inputfilename是在控件中加入

//数据处理...
}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
问题:2,如果换成引用又如何?

我将Data* CView::MakeDataArray(string inputfilename, int Originallinecount )
-----------------------------------------------------------------------------------
在 CView.h:改为:
-----------------------------------------
void MakeDataArray(string inputfilename, int Originallinecount, Data &dataRef )


----------------------------------------------------
在CView.cpp中:
-----------------------
void CView::MakeDataArray(string inputfilename, int Originallinecount, Data &dataRef )
{
//代码同上,只去除 “return *d;”而加上:

&dataRef = d; //错误1:error C2106: “=”: 左操作数必须为左值
}

void CView::RenderScene(void)
{
Data datum;
MakeDataArray( inputfilename, Originallinecount ); //inputfilename是在控件中加入

//数据处理...
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


...全文
194 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuishoumiaomiao 2009-06-29
  • 打赏
  • 举报
回复
问题已解决!非常多谢上面各位的帮忙和指导!尤其是oyljerry,两度帮忙,谢谢!!!
zlmzhuanjia 2009-06-17
  • 打赏
  • 举报
回复
帮定 up
百事烟 2009-06-17
  • 打赏
  • 举报
回复
在MFC中,如何编写能返回指向自定义数据结构指针的函数?
struct Data //命名换个酷点的 如 MYDATA
{
string name;
int age;
string work;
double account;
}

//函数定义
MYDATA * DisposeDATA()
{
MYDATA *pMYDATA = new MYDATA;
pMYDATA->name = "hello";
.......
return pMYDATA;
}

//函数使用
MYDATA *pMYDATA = DisposeDATA();
//使用......
delete pMYDATA;//记得delete;



如果换成引用又如何
只知道面试时常用,平时不用^&^
shuishoumiaomiao 2009-06-17
  • 打赏
  • 举报
回复
能否在第二个问题上找到解决方法?毕竟它只有一个错误,但我想了两天也想不出如何解决的方法!!!为方便起见,复制了一份,如下:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
问题:2,如果换成引用又如何?

我将Data* CView::MakeDataArray(string inputfilename, int Originallinecount )
-----------------------------------------------------------------------------------
在 CView.h:改为:
-----------------------------------------
void MakeDataArray(string inputfilename, int Originallinecount, Data &dataRef )


----------------------------------------------------
在CView.cpp中:
-----------------------
void CView::MakeDataArray(string inputfilename, int Originallinecount, Data &dataRef )
{
//代码同上,只去除 “return *d;”而加上:

&dataRef = d; //错误1:error C2106: “=”: 左操作数必须为左值
}

void CView::RenderScene(void)
{
Data datum;
MakeDataArray( inputfilename, Originallinecount ); //inputfilename是在控件中加入

//数据处理...
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

当然,我不知道如何在函数中如何避免上述引用的左值问题? 在 View.h 中定义了结构指针,但在 View.cpp 有不像在 VC++ 2008 那样支持,尽管都在同一个平台 Microsoft Visual Studio .NET 上,真不知道如何才可以解决!!!
shuishoumiaomiao 2009-06-17
  • 打赏
  • 举报
回复
我在 View.h 中,分别在最前端,struct Data{}前,以及在末尾尝试加上:
#ifndef DATA_H
#define DATA_H

然后在 View.cpp 前端加上 :
#include "data.h"

结果: 有两个错误:错误1:fatal error C1070: 文件“d:\mfc program\data\data\dataview.h”中的 #if/#endif 对不匹配
错误2:fatal error C1070: 文件“d:\mfc program\data\data\dataview.h”中的 #if/#endif 对不匹配

接着,我去掉了 View.h 中的
#ifndef DATA_H
#define DATA_H

结果: 有一个错误:找不到 “data.h”,或没有此文件
  • 打赏
  • 举报
回复
没有包含Data的头文件
oyljerry 2009-06-17
  • 打赏
  • 举报
回复
Data 的h文件包含#include
shuishoumiaomiao 2009-06-17
  • 打赏
  • 举报
回复
我按上面的提议,把代码 改为:
struct Data
{
string name;
int age;
string work;
double account;
} Data, *LPData;

LPData CView::MakeDataArray(string inputfilename, int Originallinecount )

结果出现了109个错误!

然后,再把改为:
typedef struct Data_tag
{
string name;
int age;
string work;
double account;
} Data, *LPData;

LPData CView::MakeDataArray(string inputfilename, int Originallinecount )
结果:出现了5个错误! 出现错误的位置与问题1相同,代码如下:(注:错误4 和 错误5 与问题1出现的错误不同)
--------------------------------------------------------------------------------------------
在CView.cpp中加入:
---------------------------------------------------------

#include <fstream>
using std::ifstream;

#include <string>
using namespace std;

// 提取文本文件的数据,并返回结构数组
Data* CView::MakeDataArray(string inputfilename, int Originallinecount ) //错误1:error C2143: 语法错误 : 缺少“;”(在“*”的前面)
//错误2:error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

{ //错误3: error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
//错误4:error C2556: “int CView::MakeDataArray(std::string,int)”: 重载函数与“CView::LPData CView::MakeDataArray(std::string,int)”只是在返回类型上不同
//错误5: error C2040: “CView::MakeDataArray”: “int (std::string,int)”与“CView::LPData (std::string,int)”的间接寻址级别不同

//其余代码相同
}
jyh_baoding 2009-06-17
  • 打赏
  • 举报
回复
帮顶一个
Conry 2009-06-17
  • 打赏
  • 举报
回复

struct跟类的定义后面要加分号的

#include <string>
using namespace std;

struct Data
{
string name;
int age;
string work;
double account;
} ;
oyljerry 2009-06-17
  • 打赏
  • 举报
回复
struct Data
{
string name;
int age;
string work;
double account;
} Data, *LPData;

LPData CView::MakeDataArray(string inputfilename, int Originallinecount )
schlafenhamster 2009-06-17
  • 打赏
  • 举报
回复
struct Data
{
string name;
int age;
string work;
double account;
}
不是类型定义,所以Data* 就不对了,可以写 struct Data * 或改成类型定义
typedef struct Data_tag
{
...
}Data, *LPDATA;

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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