如何从另一个标头 c++ 调用函数
How to call a function from another header c++
我大部分工作都在为员工的语法错误而苦苦挣扎。
这是所有 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;
};
姓名.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;
}
};
员工.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) 将具有:
默认构造函数。请记住,Name 的默认构造函数具有以下初始值:"名称"John H. Doe"。
具有 3 个参数的构造函数:一个用于名字,一个用于中间名,一个用于姓氏。
3 个私有字符串实例变量:名字、中间名和姓氏。
getFirstLast() 函数:按顺序返回名字、中间名和姓氏
printName() 函数:它打印名字、中间名和姓氏。
地址头文件 (Address.h) 将具有:
默认构造函数。请记住,Address 的默认构造函数具有以下初始值: 地址到"99999日落大道" , "比佛利山庄", "CA", "99999">
4 个私有字符串实例变量:街道、城市、州、邮编
具有 4 个参数的构造函数:一个用于街道,一个用于城市,一个用于州,一个用于 zip。
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 个参数的构造函数:一个用于名称,一个用于地址,一个用于 SSN 的字符串。
getName() 函数:它返回雇员的姓名
getAddress() 函数 :它返回雇员的地址。
getSSN() 函数:它以字符串形式返回 SSN
printEmployee() 函数:
打印名称:确保使用 Name.h 中的 printName() 函数
打印地址:确保使用 Address.h 中的 printAddress() 函数
打印 SSN。
员工(员工.cpp)类将具有:
在 void main() 函数中,您将声明:
a 名称 n;
地址 A;
和一名雇员 e;
并使用 printEmployee() 打印 e。
您还需要声明:
名字n1:你的名字
地址a1:您自己的地址
字符串 SSN1: 987-65-4321
具有名称 n1、地址 A1 和 ssn1 的员工 e1。
使用 printEmployee() 打印 e1。
我试图为您创建一个完整的示例。 您应该将声明放在头 *.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;
};
地址.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;
};
姓名.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;
};
名称.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;
}
员工.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;
};
员工.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;
}
主.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 文件编译为目标文件。然后将所有对象文件链接在一起。
例如,查看员工.cpp文件。在那里,我使用地址类中的打印方法。现在查看 Employee.cpp 文件的包含。在那里你看我包括了Employee.h,而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;
// .....
};
地址.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();
}
姓名.h
class Name
{
public:
// .....
std::string& printName() const;
// .....
};
名称.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 类中使用它们:
员工.cpp
void Employee::printEmployee() const
{
std::cout << Name.printName() << Address.printAddress() << ssn << std::endl;
}
最终编辑
在我阅读了您发布的作业的详细信息后,我认为我的第一个解决方案很好。你的教授清楚地说printAddress()
和printName()
方法应该打印而不是返回字符串。因此,也许您应该考虑使用我的第一个解决方案中的代码。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用