在公共成员函数中访问私有成员变量

3

在函数myfun中,有没有一种方法可以访问rhs.var而不编写返回var的公共函数?此外,据我所知,这是因为rhs可能是不同的类型...这正确吗?

#include <iostream>

template<class T>
class foo
{
private:
    T var;

public:
    foo(T v) : var(v) {}

    template<class Type>
    void myfun(foo<Type>& rhs)
    {
        auto i = rhs.var; //BOOM
    }
};

int main()
{
    foo<int> a = 5;
    foo<double> b = 2.2;

    a.myfun(b);
}

3
foo内部,你可以使用template <typename U> friend class foo; - user2249683
@Dieter Lücking 如此简单... 从未想过 - DeiDei
2个回答

4

建议的解决方案

你可以提供一个公共访问器来访问你的私有成员变量:

template<class T>
class foo {
  T var;
public:
  foo(T v) : var(v) {}
  T getVar() const { return var; }
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  template<class Type>
  void myfun(foo<Type>& rhs) {
    auto i = rhs.getVar();
                 ^^^^^^^^
  }
};

正如Dieter在评论中提到的那样,您可以将模板类设置为友元:

template<class T>
class foo {
  T var;
  template <class> friend class foo;
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
public:
  foo(T v) : var(v) {}
  template<class Type>
  void myfun(foo<Type>& rhs) {
    auto i = rhs.var;
  }
};

概述

模板成员函数myfun无法访问类模板foo的私有成员变量var的原因是编译器将class foo<Type>class foo<T>解释为完全不同的类类型,即使它们来自相同的模板类定义。因此,作为不同的类类型之一,一个类不能访问另一个类的私有成员。


你甚至可以移除 Utemplate <typename> friend class foo; - vsoftco

1
你可以将第二种类型定义为“炸”如下:

you can define the second type as fried like:

template<class T>
class foo
{
private:
    T var;

public:
    foo(T v) : var(v) {}

    template<class Type>
    void myfun(foo<Type>& rhs)
    {
        auto i = rhs.var; //BOOM
    }

    template<class Type> 
      friend class foo;
};

实时示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接