【发布时间】:2013-12-18 11:33:07
【问题描述】:
好的,我正在做 C++ Primer 5th Edition 中的练习,我目前正在尝试丰富本章中作为练习传递的一个类。具体来说,对于那些没有这本书的人,本章要求你写一个类,然后你慢慢地给它添加特性。到目前为止,我的代码执行正确。现在,当我尝试应用访问说明符来隐藏实现时,出现错误。首先,这是我的代码:
#include <string>
#include <iostream>
class Person
{
friend std::istream& read(std::istream& is, Person& item);
friend std::ostream& print(std::ostream& os,const Person& item);
public:
Person() = default;
Person(const std::string &s1, const std::string &s2):
name(s1),address(s2) {}
std::string ret_name() const {return name;};
std::string ret_address() const {return address;};
private:
std::string name;
std::string address;
};
std::istream& read(std::istream& is, Person& item)
{
is >> item.name >> item.address;
return is;
}
std::ostream& print(std::ostream& os,const Person& item)
{
os << item.name << " " << item.address;
return os;
}
错误表明“在此上下文中(定义构造函数的两行)'name'和'address'是私有的”。现在,据我了解这个概念,私有成员可以被类成员函数访问,但在这里,构造函数本身不能。非会员代码不会给出错误(因为我已经把这两个函数变成了朋友)。
可能出了什么问题?我对这个概念很陌生,所以我看不出出了什么问题。
提前谢谢你。
编辑 1:我尝试评论和移动声明构造函数的行。 “在此上下文中”的错误似乎再次指向这些行,因此它可能毕竟不是构造函数。
【问题讨论】:
-
缩进会很好。用空格替换你的制表符。
-
您将这两种方法声明为友元。所以这两个只能访问类外的私有变量!
-
当我在 ideone (ideone.com/ipEUXS) 上尝试这个时,没有出现错误。顺便说一句:声明
ret_函数返回const std::string &可能是个好主意 -
这是复制粘贴还是您重新输入了代码?错别字有一种奇妙的能力,可以在重新输入时消失。它是整个代码吗?
-
为我正确编译。由于
= default,我必须通过指定 -std=c++11 来确保编译器使用的是 C++11。除此之外,它还有效。