C++对象作为类成员
C++ objects as class members
从地址制作对象并尝试引用它不起作用
Student::Student(string studentInfo_c){ // student constructor
stringstream ss(studentInfo_c);
getline(ss, lastName, ',');
getline(ss, firstName, ',');
getline(ss, address1, ',');
getline(ss, address2, ',');
getline(ss, city, ',');
getline(ss, state, ',');
getline(ss, zipCode, ',');
Address sAddrs(address1, address2, city, state, zipCode);
}
ostream& operator<<(ostream& os, const Student& s){ os << s.lastName << ", " << s.firstName << " " << s.aAddrs;
return os; // first place that sAddrs oject is referenced
}
类原型:
class Student {
private:
string line;
string lastName;
string firstName;
string address1;
string address2;
string city;
string state;
string zipCode;
public:
//Student() : Address aAddrs this didnt work...
Student(string studentInfo_c);
string get_firstName();
string get_lastName();
void set_address(string address1_f, string address2_f, string city_f, string state_f, string zipCode_f);
friend ostream& operator<<(ostream& os, const Student& s);
~Student();
}
错误: 在函数 'std::ostream& operator<<(std::ostream&, const Student&(':| C:\用户\Chris\文档\2017 年夏季学期\堆操作系统\学生.cpp|67|错误:"常量类学生"没有名为"aAddrs"的成员|
C:\用户\克里斯\文档\2017 年夏季学期\df\student.cpp|73|错误:在此范围内未声明"aAddrs"|
||=== 构建失败:6 个错误、0 个警告(0 分钟、0 秒(===|
附言 我知道这与其他问题相似,但它们似乎都不适合我,它们稍微先进一些。
谢谢
根据评论中的建议,我组装了一个MCVE来展示如何做到这一点:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
class Address {
private:
string address1;
string address2;
string city;
string state;
string zipCode;
public:
// default constructor (leaving contents empty)
Address() { }
// constructor.
Address(
const string &address1, const string &address2,
const string &city, const string &state,
const string &zipCode):
address1(address1), address2(address2),
city(city), state(state), zipCode(zipCode)
{ }
friend ostream& operator<<(ostream& os, const Address &a);
};
ostream& operator<<(ostream& os, const Address &a)
{
return os
<< " Address 1: " << a.address1 << endl
<< " Address 2: " << a.address2 << endl
<< " City : " << a.city << endl
<< " State : " << a.state << endl
<< " Zip Code : " << a.zipCode << endl;
}
class Student {
private:
string lastName;
string firstName;
Address sAddrs;
public:
// constructor.
Student(const string &studentInfo_c);
friend ostream& operator<<(ostream& os, const Student &s);
};
Student::Student(const string &studentInfo_c)
// all members are default constructed (leaving them empty)
{
stringstream ss(studentInfo_c);
getline(ss, lastName, ',');
getline(ss, firstName, ',');
string address1, address2, city, state, zipCode;
getline(ss, address1, ',');
getline(ss, address2, ',');
getline(ss, city, ',');
getline(ss, state, ',');
getline(ss, zipCode, ',');
sAddrs = Address(address1, address2, city, state, zipCode);
}
ostream& operator<<(ostream &os, const Student &s)
{
return os
<< "Student " << s.lastName << ", " << s.firstName << endl
<< "Address: " << endl
<< s.sAddrs << endl;
}
int main()
{
string sample("Doe,John,1 Anyway,,Anytown,Anystate,12345,");
Student s(sample);
cout << s;
return 0;
}
使用 g++ 测试:
$ g++ -std=c++11 -o test test.cc
$ ./test
Student Doe, John
Address:
Address 1: 1 Anyway
Address 2:
City : Anytown
State : Anystate
Zip Code : 12345
$
笔记:
Address
提供了两个构造函数:一个默认构造函数和一个用于初始化的第二个构造函数。Student::Student
使用默认构造函数构造所有成员。(因此,Address
必须提供一个。在
Student::Student
的主体中,创建一个临时的Address
实例并分配给Student::sAddrs
。这是因为赋值运算符(Address& Address::operator=(const Address&)
(是由编译器生成的。(这不是最有效的代码,而是源代码工作量最少的代码。
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++是否有定义的方法来传递指向类的成员对象的成员函数的指针
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 声明成员对象而不调用其默认构造函数
- 指向成员对象的指针 - 中断线程
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 应该在成员对象上调用析构函数
- 调用成员对象的构造函数
- 将 const 类型引用对象注册为类成员对象C++
- 修改类 c++ 中的成员对象
- 从成员对象调用方法
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 构造函数,成员对象
- 不能使外部类成为内部类内的成员对象
- 使用从另一个类继承的类的对象初始化成员对象
- 如何避免需要在初始化列表中初始化成员对象
- 初始化具有参数的类成员对象的正确方法
- 将指针添加到成员对象中的指针动态阵列
- C 将成员对象函数分配给类成员功能