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

时间:2015-11-25 19:59:57

标签: c++ class templates

在函数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);
}

2 个答案:

答案 0 :(得分: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>完全解释为不同的类类型,即使它们来自相同的模板类定义。因此,作为不同的类类型,不能访问另一个类的私有成员。

答案 1 :(得分:1)

你可以将第二种类型定义为像油炸一样:

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;
};

live example