【问题标题】:Compiler error: 'private' renders variables inaccessible within the class编译器错误:“私有”使变量在类中不可访问
【发布时间】: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 &amp; 可能是个好主意
  • 这是复制粘贴还是您重新输入了代码?错别字有一种奇妙的能力,可以在重新输入时消失。它是整个代码吗?
  • 为我正确编译。由于= default,我必须通过指定 -std=c++11 来确保编译器使用的是 C++11。除此之外,它还有效。

标签: c++ private member


【解决方案1】:

我认为类定义没有任何问题。错误的原因可能是其他代码错误地使用了此定义,或者您的编译器不支持说明符default。尝试用你的默认构造函数替换

Person() {}

并重新编译您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2020-12-11
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多