从C#切换到C.我的代码出了什么问题?我需要标题我正在尝试做什么?一个文件问题中的类定义

从C#切换到C.我的代码出了什么问题?我需要标题我正在尝试做什么?一个文件问题中的类定义,第1张

概述我已经用C#编程了几年,因为这是我的第一语言.我正试图刷新我的c,因为我将很快处理那些编码的东西. 这段代码出了什么问题:(我知道可能有很多错误.C在需要时与C#有很大不同).有人告诉我,我不知道如何在C中正确声明类,并且我需要使用标头定义我的类.我需要标题吗?这是一个小程序,只是为了测试,想知道是否可以在没有它的情况下完成.丢失的标题是唯一的问题吗?我有一个关于无法在公司中访问Parse的错误, 我已经用C#编程了几年,因为这是我的第一语言.我正试图刷新我的c,因为我将很快处理那些编码的东西.

这段代码出了什么问题:(我知道可能有很多错误.C在需要时与C#有很大不同).有人告诉我,我不知道如何在C中正确声明类,并且我需要使用标头定义我的类.我需要标题吗?这是一个小程序,只是为了测试,想知道是否可以在没有它的情况下完成.丢失的标题是唯一的问题吗?我有一个关于无法在公司中访问Parse的错误,但是当我在公司类名称前添加public时,会引发更多错误.

AUGH!太令人沮丧了.

#include "std_lib_facilitIEs.h"using namespace std;class Employee{public:    string screen_name;    string real_name;    string current_job;    int employee_number;    Employee(int no,string name1,string name2,string current_jobin)    {        screen_name=name1;        real_name=name2;        employee_number=no;    current_job=current_jobin;    }};class Project{public:    Vector<Employee> Employees;    int max_worker_quota;    int project_ID;    string project_name;    Project(int no_in,int max_in,string Title_in)    {        max_worker_quota=max_in;        project_name=Title_in;        project_ID=no_in;    }};unsigned int split(const std::string &txt,vector<std::string> &strs,char ch){    unsigned int pos = txt.find( ch );    unsigned int initialPos = 0;    strs.clear();    // Decompose statement    while( pos != std::string::npos ) {        strs.push_back( txt.substr( initialPos,pos - initialPos + 1 ) );        initialPos = pos + 1;        pos = txt.find( ch,initialPos );    }    // Add the last one    strs.push_back( txt.substr( initialPos,std::min( pos,txt.size() ) - initialPos + 1));    return strs.size();}class Company{Vector<Employee> EmployeeList;Vector<Project> ProjectList;    voID Parse(string input)    {        //Case Statements        vector<string> temp;        split( input,temp,' ' );        if (temp[0]=="S")        {            //Add Employee to Company            Employee myEmployee=Employee(atoi(temp[1].c_str()),temp[2],temp[3],temp[4]);            EmployeeList.push_back(myEmployee);        }        else if (temp[0]=="C")        {            //Add Project to Company            Project myProject=Project(atoi(temp[1].c_str()),atoi(temp[2].c_str()),temp[3]);            ProjectList.push_back(myProject);        }        else if (temp[0]=="L")        {            //Add Employee to Project List            //Not Implemented-Find Project by temp[1] which is a int        }        else if (temp[0]=="A")        {        }        else if (temp[0]=="D")        {        }        else if (temp[0]=="PS")        {        }        else if (temp[0]=="PC")        {        }    }};int main(int argc,char *argv[]){string input;cout<<"Command:: ";cin>>input;Company myCompany;myCompany.Parse(input); //input is in the format X name name etc etc. Arguments separated by spacesreturn 0;}
解决方法 首先,您不需要标题用于测试目的.但是如果没有它们,你就无法创建一个真正的程序,因为标题定义了单独编译的程序部分的接口.这就是C/C++的工作方式,没有办法解决.

其次,您必须将public:添加到您的Company类并处理以下错误.它就像C#的东西:你必须使一个函数定义为public voID Parse(string)才能从类外部访问它. C方式是

class Foo { public:voID bar();};

第三,在C中定义非简单函数在类定义中是非常规的(唯一的例外是模板类).那是标题故事的另一面.

好的,这里是基本标题相关内容的简要说明.

程序通常分为单独编译的文件集,即翻译单元.每个单元通常由一个.cpp文件和一个或多个头文件(.h)组成.编译这些文件时,您将获得一个二进制.obj文件.该文件包含对象 – 函数代码和初始化全局(和命名空间)对象所需的东西.要创建程序,您需要将一个或多个目标文件传递给链接器.在VS中它发生在幕后.您只需将.cpp文件添加到项目树中,IDE将相应地配置项目依赖项.

这就是你的代码的样子:

//file: employee.h#ifndef EMPLOYEE_HDR  /* include guard */#define EMPLOYEE_HDR#include <string>using std::string;class Employee {public:Employee (int no,string current_jobin);voID PayBonus(int amount);voID Fire(string reason);int GetSalary() const{ return m_Salary; }/*...*/protected:int m_Salary;string m_Firstname;/* ... */};#endif//file: employee.cpp#include "employee.h"Employee::Employee (int no,string current_jobin){ //deFinition}voID Employee::PayBonus(int amount){ //deFinition}voID Employee::Fire(string reason){//deFinition}/* define other non-trivial class functions here *///file: company.h#ifndef COMPANY_HDR  /* include guard */#define COMPANY_HDR#include <vector>using std::vector;#include "employee.h"class Company {public:Company();voID Hire(string name);voID WorldCreditCrunch() //life is unfair{ FireEveryone(); }voID Xmas(); //pays  bonus to everyone/* ... */protected:vector<Employee> m_Staff;voID FireEveryone();/* ... */};#endif//file: company.cpp#include "company.h"Company::Company(){ //deFinition}voID Company::Hire(string name){     //calculate new employee ID etc     m_Staff.push_back(Employe( /*...*/));}voID Company::FireEveryone(){    for(size_t i = 0; i < m_Staff.size(); ++i)         m_Staff[i].Fire();}voID Company::Xmas(){    for(size_t i = 0; i < m_Staff.size(); ++i)         m_Staff[i].PayBonus(5);}/* ... *///file: main.cpp#include "company.h"int main(){     Company c;     c.Hire("John Smith");     /* ...*/     return 0;}

所以,基本上我们会有员工,公司和主要单位. employee.h中Employee类的定义包含非平凡函数声明.像GetSalary()这样的简单函数就在类中定义.它给出了编译器内联它的提示. employee.cpp包含其余的函数定义;

company.h文件有#include“employee.h”预处理器语句.因此,我们可以在类定义及其实现文件(company.cpp)中使用Employee对象.

main.cpp包含程序入口点.它可以使用Company类,因为它包含“company.h”.

如果我们在Employee :: Hire()函数实现中更改了某些内容,则只会重新编译employee.obj.这是此类计划组织的主要目的.但是,如果我们更改Employee接口(employee.h中的类定义),则每个程序单元都需要重新编译.

如果您执行以下 *** 作,则需要包含防护:

#include "employee.h"#include "company.h"  /* will contain the 2nd inclusion of employee.h which will be                         prevented by include guard */

基于Microsoft Visual C的项目通常使用#pragma一次用于相同目的.它更容易使用,但通常不便携.

例如,如果在employee.h中放置Employee :: Hire定义,编译器会将函数代码放在employee.obj和company.obj中(因为company.h包含employee.h).当您尝试在这种情况下链接时,链接器将遇到相同功能代码的2个版本,并将给出错误.内联函数不会编译到单独的实体中,因此不会导致此类错误.模板代码也是如此,它仅在模板实例化时生成.因此,几个翻译单元可能具有相同的非内联模板功能的代码.

程序员可以定义程序的部件边界.如果需要,您可以将公司和员工放入单个翻译单元. VS向导倾向于为每个主要类别制作一个.h / .cpp对.尝试制作一个MFC项目并亲自看看.

这些是基础知识.正如我在上面的评论中提到的,你可以从Stroustrup的“The C programming language”中全面了解这些内容.

总结

以上是内存溢出为你收集整理的从C#切换到C.我的代码出了什么问题?我需要标题我正在尝试做什么?一个文件问题中的类定义全部内容,希望文章能够帮你解决从C#切换到C.我的代码出了什么问题?我需要标题我正在尝试做什么?一个文件问题中的类定义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存