MFC用对话框编程,使用自定义类中的函数出现了以下有关问题
MFC用对话框编程,使用自定义类中的函数出现了以下问题

------解决思路----------------------
C_Ops的.h和.cpp文件函数的声明格式不正确,与类向导生成的对比一下~~
// MFC_OS_Des_4Dlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MFC_OS_Des_4.h"
#include "MFC_OS_Des_4Dlg.h"
#include "afxdialogex.h"
#include "C_Random.h"
#include "C_UserInP.h"
#include "C_Alext.h"
#include "C_Ops.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFC_OS_Des_4Dlg 对话框
CMFC_OS_Des_4Dlg::CMFC_OS_Des_4Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFC_OS_Des_4Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFC_OS_Des_4Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFC_OS_Des_4Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_Random, &CMFC_OS_Des_4Dlg::OnBnClickedButtonRandom)
ON_BN_CLICKED(IDC_BUTTON_Alext, &CMFC_OS_Des_4Dlg::OnBnClickedButtonAlext)
END_MESSAGE_MAP()
// CMFC_OS_Des_4Dlg 消息处理程序
BOOL CMFC_OS_Des_4Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFC_OS_Des_4Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFC_OS_Des_4Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFC_OS_Des_4Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFC_OS_Des_4Dlg::OnBnClickedButtonRandom()
{
// TODO: 在此添加控件通知处理程序代码
C_Random Dlg;
C_Ops Ops;
PDataType P;
Ops.RandomJob(P, 8);/* 问题在这里,我想要调用类C_Ops中的方法,但是老是报错*/
Dlg.DoModal();
}
void CMFC_OS_Des_4Dlg::OnBnClickedButtonAlext()
{
// TODO: 在此添加控件通知处理程序代码
C_Alext Dlg;
/*
Ops.GetAlext(Dlg.AlextJobList);//将实例作业放置到作业链表中
Dlg.AlextJobList->next->JID = Dlg.AlexJID;
Dlg.AlextJobList->next->priority = Dlg.AlexPrio;
Dlg.AlextJobList->next->request_time = Dlg.AlexRequestime;
Dlg.AlextJobList->next->urgen = Dlg.AlexUrgen;
UpdateData(TRUE);
Dlg.DoModal();
*/
}
#include "stdafx.h"
#include "DataType.h"
#include"iostream"
#include "C_Ops.h"
C_Ops::C_Ops()
{
}
C_Ops::~C_Ops()
{
}
using namespace std;
void CreateChain(PDataType &P)
{
P = new DataType;
P->next = NULL;
P->last = NULL;
}
void AddNode(PDataType &P, int i)
{
PDataType Q = new DataType;
//cout << "Please enter the ID of this Job:";
Q->JID = i;
/*cout << "Please enter the Priority of this Job:";
cin >> Q->priority;
cout << "Please enter the Request_time of this Job:";
cin >> Qrequest_time;
cout << "Please enter the Urgen of this Job:";
cin >> Q.urgen;
Q->data.run_time = 0;
*/
Q->next = P->next;
Q->last = P;
if (P->next)
P->next->last = Q;
P->next = Q;
}
/*
void ShowJobs(JobPoint &P)//显示当前的作业状况
{
JobPoint Q;
Q = P->next;
while (Q)
{
cout << "JID:" << Q->data.JID << " Priority:" << Q->data.priority << " Request_time:" << Q->data.request_time;
cout << " Run_time:" << Q->data.run_time << " Urgen:" << Q->data.urgen << endl;
Q = Q->next;
}
cout << "All jobs output over!" << endl;
}
*/
void Add_e_To_Chain(PDataType &P, PDataType e)//将节点e放到P中
{
e->next = P->next;
e->last = P;
if (P->next)
P->next->last = e;
P->next = e;
}
void Chioes_one(PDataType P, PDataType &E)//从链表中选取一个作业,放置到E节点中,最短作业算法
{
PDataType Q;
Q = P->next;
int Shortest = 0;//记录最短作业所耗时间
Shortest = Q->request_time - Q->run_time;
E = Q;
while (Q)//循环一轮从中选取还需要运行的时间最短的作业
{
if (Shortest > (Q->request_time - Q->run_time))
{
Shortest = Q->request_time - Q->run_time;
E = Q;
}
Q = Q->next;
}
}
void Chioes_Prior(PDataType P, PDataType &E)
{
PDataType Q;
Q = P->next;
int MaxPrior = 0;
MaxPrior = Q->priority;
E = Q;
while (Q)
{
if (MaxPrior < Q->priority)
{
MaxPrior = Q->priority;
E = Q;
}
Q->priority += Q->urgen;//重新计算优先级
Q = Q->next;
}
}
void ExcuteJob(PDataType &E)
{
E->run_time += 10;
}
void CheckJobChain(PDataType &P)//检查作业链表执行状况
{
PDataType Q;
Q = P->next;
while (Q)
{
/*
if (Q->data.run_time >= Q->data.request_time)//如果是头节点之后的节点
{
P->next = Q->next;
Del = Q;
}
if (Q->next)//如果Q->next存在
{
if (Q->next->data.run_time >= Q->next->data.request_time)
{
Del = Q->next;
Q->next = Del->next;
}
}
Q = Q->next;
*/
if (Q->run_time >= Q->request_time)
{
PDataType Del;
Del = Q;
Q->last->next = Q->next;
if (Q->next)//如果不是最后一个节点
Q->next->last = Q->last;
Q = Q->next;
// cout << "Job ID " << Del->JID << " Already Done!" << endl;
delete Del;
continue;
}
// free(Del);//该指针所指向作业已经完成并且从链表中去除
Q = Q->next;
}
}
/*
void ExcJobChain(PDataType &P, int Tac)//执行这个作业链表
{
PDataType E;
while (P->next)
{
switch (Tac)//执行作业选取的策略
{
case 1://可变优先级
Chioes_Prior(P, E);//从链表中选择一个作业
break;
case 2://最短作业有限
Chioes_one(P, E);
break;
case 3:
break;
}
ExcuteJob(E);//执行这个作业
CheckJobChain(P);//从链表中删除这个作业
}
}
*/
#include<time.h>
void GetAlext(PDataType &P)//将所给的十个作业加载到一个数组中。
{
DataType *Alext=new DataType[11];
int i = 1;
for (; i < 11; i++)
{
Alext[i].JID = i;
Alext[i].run_time = 0;
}
Alext[1].priority = 47;
Alext[1].request_time = 983;
Alext[1].urgen = 1;
Alext[2].priority = 91;
Alext[2].request_time = 118;
Alext[2].urgen = 2;
Alext[3].priority = 96;
Alext[3].request_time = 949;
Alext[3].urgen = 1;
Alext[4].priority = 27;
Alext[4].request_time = 559;
Alext[4].urgen = 5;
Alext[5].priority = 72;
Alext[5].request_time = 493;
Alext[5].urgen = 5;
Alext[6].priority = 61;
Alext[6].request_time = 722;
Alext[6].urgen = 3;
Alext[7].priority = 64;
Alext[7].request_time = 120;
Alext[7].urgen = 3;
Alext[8].priority = 42;
Alext[8].request_time = 986;
Alext[8].urgen = 1;
Alext[9].priority = 15;
Alext[9].request_time = 253;
Alext[9].urgen = 5;
Alext[10].priority = 72;
Alext[10].request_time = 807;
Alext[10].urgen = 5;
for (i = 1; i < 11; i++)
{
PDataType e = new DataType;
*e = Alext[i];
e->next = NULL;
Add_e_To_Chain(P, e);
}
}
/*
void UserCreat(PDataType &P)//用户自己添加作业,将作业添加到节点P所指向的链表中
{
int Ch = 1;//用来判断是否继续输入
int i = 0;
while (Ch != 0)
{
i++;//用来给作业ID赋值
AddNode(P, i);//将作业节点添加到任务中
cout << "是否继续添加作业?若要继续请输入任意数字,如果输入作业完毕请输入数字0:";
cin >> Ch;
};
}
*/
/*void RandomJob(JobPoint &P)
{
cout << "本模式下自动产生作业,请输入要产生的作业的个数:";
int i = 0;
cin >> i;//随机产生的作业的个数。
srand((unsigned)time(0));
while (i)
{
JobPoint e = new JobNode;
e->data.JID = i;
//随机产生作业数据
e->data.priority = rand() % 99 + 1;
e->data.request_time = rand() % 999 + 1;
e->data.run_time = 0;
e->data.urgen = rand() % 4 + 1;
//将作业添加到链表中
Add_e_To_Chain(P, e);
i--;
}
}*/
void RandomJob(PDataType &P, int i)
{
//cout << "本模式下自动产生作业,请输入要产生的作业的个数:";
//int i = 0;
//cin >> i;//随机产生的作业的个数。
srand((unsigned)time(0));
while (i)
{
PDataType e = new DataType;
e->JID = i;
//随机产生作业数据
e->priority = rand() % 99 + 1;
e->request_time = rand() % 999 + 1;
e->run_time = 0;
e->urgen = rand() % 4 + 1;
//将作业添加到链表中
Add_e_To_Chain(P, e);
i--;
}
}
#pragma once
class C_Ops
{
public:
C_Ops();
~C_Ops();
public:
void CreateChain(PDataType &P);
void AddNode(PDataType &P, int i);
void ShowJobs(PDataType &P);//显示当前的作业状况
void Add_e_To_Chain(PDataType &P, PDataType e);//将节点e放到P中
void Chioes_one(PDataType P, PDataType &E);//从链表中选取一个作业,放置到E节点中,最短作业算法
void Chioes_Prior(PDataType P, PDataType &E);
void ExcuteJob(PDataType &E);
void ExcJobChain(PDataType &P, int Tac);//执行这个作业链表
void GetAlext(PDataType &P);//将所给的十个作业加载到一个数组中。
void UserCreat(PDataType &P);
void RandomJob(PDataType &P, int i);
};
#pragma once
class DataType
{
public:
DataType();
~DataType();
public:
//struct JobData{
int JID; //作业号
int request_time; //所需运行时间
int run_time; //作业实际运行时间
int priority; //作业优先级
int urgen; //作业紧迫性
//};
//typedef struct JobNode {
// JobData data; //数据域
// JobNode *next; //下一个节点
// JobNode *last; //前一个节点
//} JobNode, *JobPoint;
DataType *next;
DataType *last;
};
typedef DataType * PDataType;
#include "stdafx.h"
#include "DataType.h"
DataType::DataType()
{
}
DataType::~DataType()
{
}
------解决思路----------------------
C_Ops的.h和.cpp文件函数的声明格式不正确,与类向导生成的对比一下~~