【问题标题】:Friend ostream& operator<< can't access private member朋友ostream&运营商<<不能访问私人会员
【发布时间】:2018-04-15 14:44:57
【问题描述】:

大概,这就是我的代码的样子:

template<typename K, typename V>
class A{
 private:
   size_t num_;
 public:
   A(initializer_list< something<K,V> > smthng);
   friend ostream& operator<<(ostream &out, const A &as){
       size_t number = num_;
  };  
};

template<typename K, typename V>
A<K,V>::A(initializer_list< something<K,V> > smthng){

    size_t sz = 5;
    num_ = sz;
}

由于某种原因,当我尝试编译时,我的代码总是会给出“错误:非静态数据成员的无效使用”作为错误。显然上面的代码不是我所拥有的,但这是我得到的唯一错误。我认为使用朋友功能的好处是您可以访问私人成员,但我似乎不能这样做。

【问题讨论】:

    标签: c++ friend


    【解决方案1】:

    友元函数是 w.r.t 的外部函数。您在其中定义它的类。您可以访问私有成员,但没有可用的 this 指针。

    因此,你应该改变

    size_t number = num_; 
    

    size_t number = as.num_;
    

    operator&lt;&lt;() 实现中。

    【讨论】:

    • 在朋友内调用 as.num_ 会导致分段错误
    • 你确定你正确初始化了参数as的值吗?使用引用并不能保证引用有效。
    • 是的,这是一个学校项目,这些都是老师正确初始化的
    【解决方案2】:

    就目前而言,您正在使用 num_ 变量,就像它是一个静态成员变量一样,也就是说,它不属于某个类的特定对象,而是属于整个类。您需要做的是指示您需要通过

    class A{
    
    private:
        int num_;
    
    public:
        A();
    
    friend std::ostream& operator<<(std::ostream &out, const A &as)
    {
       int number = as.num_;
       out << number << std::endl;
    }  
    };
    
    A::A()
    {
    
       int sz = 5;
       num_ = sz;
    }
    
    int main()
    {
       A object;
       std::cout << object << std::endl;
    
       return 0;
    }  
    

    这对我来说很好。尝试按原样编译它,您将看到它在控制台上显示 5 而没有错误。分段错误可能是由于您的代码上的另一个错误。

    【讨论】:

    • 感谢您的评论,但这会导致分段错误
    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多