我猜想我可能必须使用指针,但是在课堂上还没有深入探讨它们,以尝试在程序中实现它们。到目前为止,我的打印功能已接近程序的中间位置。我不确定如何从向量中打印出元素,因为我的方法行不通。
$scope.$on("$locationChangeStart", function(event, newUrl) {
event.preventDefault();
if (confirm("You have unsaved changes. Are you sure you want to leave this page without saving?")) {
$location.path($location.url(newUrl).hash());
}
});
答案 0 :(得分:1)
πάνταῥεῖ是正确的,但要添加更多细节...
您需要指定希望流如何处理对象的方式。通过添加<<
运算符可以完成此操作。例如:
std::ostream& operator<<(std::ostream& s, const rolodex& r){
// Or however you want to format it.
s << "Name: " << r.name << " : ";
s << "Street: " << r.street << " : ";
s << "Town: " << r.town << " : ";
s << "State: " << r.state << " : ";
s << "Zip: " << r.zip << "\n";
}
不幸的是,上面的函数试图访问您的类的私有字段,但不能,因为它不是类定义的一部分。
一种简单的解决方法是在类定义内部将这个函数声明为“朋友”,例如:
friend std::ostream& operator<<(std::ostream&, const rolodex&);
...由于您可能会喜欢它,因此可以直接使用一个大的可复制粘贴的块使您的功能正常工作
class rolodex
{
string name;
string street, town, state;
string zip;
string phone;
vector <rolodex> entries;
public:
rolodex();
void getmenu();
void add_entry();
void set_name();
void set_address();
void set_phone();
void printinfo();
friend std::ostream& operator<<(std::ostream&, const rolodex&);
};
std::ostream& operator<<(std::ostream& s, const rolodex& r){
// Or however you want to format it.
s << "Name: " << r.name << " : ";
s << "Street: " << r.street << " : ";
s << "Town: " << r.town << " : ";
s << "State: " << r.state << " : ";
s << "Zip: " << r.zip << "\n";
}
答案 1 :(得分:1)
按照πάνταῥεῖ的建议,这是一种实现方法,尽可能少地更改设计:
1)为rolodex类创建一个非成员重载运算符<<:
std::ostream& operator<< (std::ostream& os, const rolodex& rol)
{
os << rol.name << ":" << std::endl
<< "\t" << rol.street << std::endl
<< "\t" << rol.town << std::endl
<< "\t" << rol.state << std::endl
<< "\t" << rol.zip << std::endl
<< "\t" << rol.phone << std::endl;
return os;
}
..,但是编译器会责备您尝试从类外部访问私有成员(默认情况下,成员是私有的),因此您将需要放宽规则:
class rolodex
{
...
public:
...
friend std::ostream& operator<< (std::ostream& os, const rolodex& rol);
};
您不能在类本身内部包含运算符<<,请参见does-overloading-operator-works-inside-the-class。
但是,无论如何,将getter函数添加到公共接口中几乎总是更好的设计。您将在类def的get_name()
部分中拥有public:
等,这些函数最初只会返回私有成员变量的值,然后您的operator <<可以使用它们而不是尝试访问私人成员。然后,您不再需要friend
声明。
我赞成一些程序员哥关于您设计的评论
用于让用户输入数据的代码实际上不应该放在rolodex类内部,因为它使类难以重用。例如,图像想通过图形界面重新使用rolodex,而让rolodex在向量中包含其自身的实例并不是一个好主意。
我建议
1)包含所有人员属性的人员类,具有不使用特定输入方法的公共获取器get_name()
和设置器set_name()
,只需将数据作为参数即可,例如set_name(std::string& name)
。
2)非成员运算符<<,用于将人输出到输出流
3)一个带有私有std::vector<Person>
的Rolodex类,以及添加人员,将所有人员写入输出流的方法,等等。
祝你好运并享受:-)
编辑:终端上的菜单结构应恕我直言放在main()函数内部或封装到另一个类中。但是,当然,不要把它留在Rolodex或更糟的地方了,