如何从另一个标头调用函数

时间:2018-10-09 22:11:40

标签: c++ data-structures

我的大部分工作都在努力解决员工的语法错误。

这是所有3个标题

地址.h

#pragma once
#include <string>
using namespace std;

class Address
{
public:
    explicit Address();
    explicit Address(const string& city, const string& state,
        const string& street, const string& zip);
    const string& getCity() const;
    const string& getState() const;
    const string&  getStreet() const;
    const string&  getZip() const;
    void printAddress() const;
private:
    string street;
    string city;
    string state;
    string zip;
};

Address::Address() :
    city("Beverly Hills,"),
    state("CA,"),
    street("99999 Sunset Boulevard,"),
    zip("99999")
{ }

Address::Address(const string& city, const string& state,
    const string& street, const string& zip) :
    city(city), state(state), street(street), zip(zip)
{ }

const string& Address::getCity() const
{
    return city;
}
const string& Address::getState() const
{
    return state;
}
const string& Address::getStreet() const
{
    return street;
}
const string& Address::getZip() const
{
    return zip;
}
void Address::printAddress() const
{
    std::cout << street << city << state << zip << endl;
};

Name.h

#include <string>
using namespace std;

class Name
{
public:
    explicit Name();
    explicit Name(const string& firstName, const string& middleName, const string& lastName);
    const string& getFirstLast() const;
    void printName() const;
private:
    string firstName;
    string middleName;
    string lastName;

    Name::Name() :
        firstName("John"),
        middleName("H."),
        lastName("Doe")
    {}
    Name::Name(const string& firstName, const string& middleName, const string& lastName) :
        firstName(firstName), lastName(lastName)
    { }
    const string& Name::getFirstLast() const
    {
        return name;
    }

    void Name::printName() const
    {
        std::cout << firstName << middleName << lastName << endl;


    }
};

Employee.H

这是我大多数错误的出处。

#include <iostream>
#include <string>
#include "Name.h"
#include "Address.h"
using namespace std;

class Employee
{
public:
    explicit Employee();
    explicit Employee(const Name& name, const Address& address, const string& ssn);
    const string& getName() const;
    const string& getSSN() const;
    const string& getAddress() const;
    void printEmployee() const;
private:
    Name name;
    Address address;
    string ssn;
};
Employee::Employee() :
    name("John H. Doe"),
    address("99999 Sunset Boulevard", "Beverly Hills", "CA", "99999"),
    SSN("999-99-9999")
{}
Employee::Employee(const Name& name, const Address& address, const std::string& ssn) :
    name(name), address(address), ssn(ssn)
{ }

const string& Employee::getName() const
{
    return printName;
}

const string& Employee::getSSN() const
{
    return ssn;
}
const string& Employee::getAddress() const
{
    return address
}


void Employee::printEmployee() const
{
cout << Name.printName() << Address.printAddress() << ssn << std::endl;
}

这是作业说明

名称头文件(Name.h)将具有:

默认构造函数。请记住,名称的默认构造函数具有以下初始值:名称为“ John H. Doe”。

具有3个参数的构造函数:一个用于名字,一个用于中间名和一个用于姓氏。

3个私有字符串实例变量,分别用于:名字,中间名和姓氏。

getFirstLast()函数:按顺序返回名字,中间名和姓氏

printName()函数:它打印名字,中间名和姓氏。

地址头文件(Address.h)将具有:

默认构造函数。请记住,“地址”的默认构造函数具有以下初始值:“ 99999 Sunset Boulevard”,“ Beverly Hills”,“ CA”,“ 99999”的地址

4个私有字符串实例变量,分别用于:街道,城市,州,邮政编码

一个具有4个参数的构造函数:一个用于街道,一个用于城市,一个用于州,一个用于邮政编码。

getCity():它返回城市

getState():返回状态

getStreet():返回街道

getZip():它返回zip

printAddress():打印街道,城市,州和邮政编码。

员工头文件(Employee.h)将具有:

3个私有实例变量:一个用于名称(使用上面的标题名称),一个用于地址(使用上面的地址标题),一个SSN的字符串变量。

默认的构造函数,该构造函数将SSN初始化为“ 999-99-9999”,名称为“ John H. Doe”,地址为“ 99999 Sunset Boulevard”,“ Beverly Hills”,“ CA”,“ 99999”

具有3个参数的构造函数:一个用于Name,一个用于Address,一个用于SSN的字符串。

getName()函数:它返回员工的姓名

getAddress()函数:它返回员工的地址。

getSSN()函数:它以字符串形式返回SSN

printEmployee()函数:

打印名称:确保使用Name.h中的printName()函数

打印地址:确保使用Address.h中的printAddress()函数。

打印SSN。

Employee(Employee.cpp)类将具有:

在void main()函数中,您将声明:

一个名字n;

地址A;

和一个雇员e;

并使用printEmployee()打印e。

还需要声明:

名字n1:您的名字

地址a1:您自己的地址

字符串ssn1:987-65-4321

雇员e1,其名称为n1,地址为A1,而名称为ssn1。

使用printEmployee()打印e1。

1 个答案:

答案 0 :(得分:3)

我试图为您创建一个完整的示例。 您应该在头文件* .h文件中放置声明。 实施程序放在* .cpp文件中。

地址.h

#pragma once
#include <string>

class Address
{
public:
    explicit Address();
    explicit Address(const std::string& city, const std::string& state,
        const std::string& street, const std::string& zip);
    const std::string& getCity() const;
    const std::string& getState() const;
    const std::string&  getStreet() const;
    const std::string&  getZip() const;
    void printAddress() const;
private:
    std::string street;
    std::string city;
    std::string state;
    std::string zip;
};

Address.cpp

#include "Address.h"
#include <iostream>

// Default Constructor
Address::Address() :
    city("Beverly Hills"),
    state("CA"),
    street("99999 Sunset Boulevard"),
    zip("99999")
{ }

Address::Address(const std::string& city, const std::string& state,
    const std::string& street, const std::string& zip) :
    city(city), state(state), street(street), zip(zip)
{ }

const std::string& Address::getCity() const
{
    return city;
}
const std::string& Address::getState() const
{
    return state;
}
const std::string& Address::getStreet() const
{
    return street;
}
const std::string& Address::getZip() const
{
    return zip;
}
void Address::printAddress() const
{
    // removed the endl here !
    std::cout << "Address: " << street << ", " << city << ", "
        << state << ", " << zip;
};

Name.h

#pragma once
#include <string>

class Name
{
public:
    explicit Name(const std::string& firstName, const std::string& lastName);
    void printName() const;
private:
    std::string firstName;
    std::string lastName;
};

Name.cpp

#include "Name.h"
#include <iostream>

Name::Name(const std::string& firstName, const std::string& lastName) :
    firstName(firstName), lastName(lastName)
{ }

void Name::printName() const
{
    std::cout << "Name: " << lastName << ", " << firstName;
}

Employee.h

#pragma once
#include <string>
#include "Name.h"
#include "Address.h"

class Employee
{
public:
    explicit Employee(const Name& name, const Address& address, const std::string& ssn);
    void printEmployee() const;
private:
    Name name;
    Address address;
    std::string ssn;
};

Employee.cpp

#include "Employee.h"
#include <iostream>

Employee::Employee(const Name& name, const Address& address, const std::string& ssn) :
    name(name), address(address), ssn(ssn)
{ }

void Employee::printEmployee() const
{
    std::cout << "Employee: ";
    name.printName();
    std::cout << ", ";
    address.printAddress();
    std::cout << ", ssn: " << ssn << std::endl;
}

Main.cpp

#include <iostream>
#include <string>
#include "Employee.h"

int main(int argc, char* argv[]) {

    Address address("Cologne", "NRW", "Domplatz 1", "D-50668");
    Name name("John", "Jones");

    Employee employee(name, address, "123-abc-456");
    employee.printEmployee();

    return 0;
}

那很有趣! :-)

编辑:

我想我需要添加一些解释:

如果要在另一个cpp文件中的一个cpp文件中使用函数或方法,则应分开声明和实现。实际上,您应该始终这样做。将声明放入* .h文件中,并将实现放入* .cpp文件中。在要使用该函数的cpp文件中,包括声明该函数的头文件。然后将所有cpp文件编译为目标文件。然后将所有对象文件链接在一起。

例如,查看Employee.cpp文件。在那里,我使用Address类中的print方法。现在查看Employee.cpp文件的include。在那里,您看到我包含Employee.h,而后者又包含Address.h。实际上包括的只是将一个文件的内容插入另一个文件。因此,现在我们在Employee cpp文件中包含了Address类和方法的声明,以便可以从那里调用它。

另一个更新

我测试了昨天发布的代码。工作正常。问题开始是因为您想像这样更改printEmployee()方法:

void Employee::printEmployee() const
{
    cout << Name.printName() << Address.printAddress() << ssn << std::endl;
}

这仅在printName()和printAddress()方法不打印而是返回字符串时才有效。在那种情况下,软件开发人员通常将方法命名为ToString()或类似名称。但是我们会保留原来的名称,因为我们坚持您的教授的工作。

您必须更改头文件中方法的声明以返回字符串。然后,您还必须更改cpp文件中的实现以返回字符串。在这里(不完整的源代码,只有更改):

地址.h

class Address
{
public:
    // .....
    std::string& printAddress() const;
    // .....
};

Address.cpp

// Add this new include to the others at the top of the file:
#include <sstream>

// ......

std::string& Address::printAddress() const
{
    std::stringstream ss;
    ss << "Address: " << street << ", " << city << ", "
        << state << ", " << zip;
    return ss.str();
}

Name.h

class Name
{
public:
    // .....
    std::string& printName() const;
    // .....
};

Name.cpp

// Add this new include to the others at the top of the file:
#include <sstream>

// ......

std::string& Name::printName() const
{
    std::stringstream ss;
    ss << "Name: " << lastName << ", " << firstName;
    return ss.str();
}

现在,您可以根据需要在Employee类中使用它们:

Employee.cpp

void Employee::printEmployee() const
{
    std::cout << Name.printName() << Address.printAddress() << ssn << std::endl;
}

最终编辑

在阅读了您发布的作业的详细信息之后,我认为我的第一个解决方案很好。您的教授明确指出printAddress()printName()方法应打印而不返回字符串。因此,也许您应该考虑使用我第一个解决方案中的代码。