0

クラスの外部からプライベート メンバーを表示する(および変更にもアクセスしない)方法があるかどうかを知りたいですか?

template <typename type_>
class OBJ1
{
  //methods
};

class OBJ2
{
  private:
    OBJ1<int> my_obj;
};

class OBJ3
{
  public:
    template <typename type_>
    void magic_method(OBJ1<type_> obj)
    {
      //with another intermediate class, call one of OBJ1's public methods
      //anotherClass::call(obj);
    }
};

my_objG++ は内に何があるかを知らないため、明らかにこれは機能しませんclass OBJ3。このコードをコンパイルする方法はありますか? 前方宣言か何かのように?繰り返しますが、他のクラスは「OBJ1 宣言オブジェクト」が存在することを知る必要があります。

ありがとう !

4

3 に答える 3

0

あなたが何を望んでいるのか正確にはわかりません...しかし、正しく理解できれば、OBJ3内からOBJ2プライベートセクションにアクセスしたいと考えています。

template <typename type_>
class OBJ1
{
  //methods
};

template <typename type_>
class OBJ2
{
  private:
    OBJ1<type_> my_obj;
    friend class OBJ3;
};

class OBJ3
{
  public:
    template <typename type_>
    void magic_method(OBJ2<type_> obj)
    {
      std::cout << obj.my_obj;
      //with another intermediate class, call one of OBJ1's public methods
      //anotherClass::call(obj);
    }
}
于 2012-10-03T10:26:36.163 に答える
0
// call one of OBJ1's *public* methods

以下に示すように、簡単に機能させることができます。実際の問題はOBJ2何ですか?気になるプライベート アクセス エラーを表示するコードを投稿します。

#include <iostream>
#include <typeinfo>

template <typename type_>
class OBJ1
{
  public:
  void print_type_name() {
    std::cout << typeid(type_).name() << "\n";
  }
};

/*
class OBJ2
{
  private:
    OBJ1<int> my_obj;
};
*/

class anotherClass {
  public:
    template <typename type_>
    static void call(OBJ1<type_> obj) {
        obj.print_type_name();
    }
};

class OBJ3
{
  public:
    template <typename type_>
    void magic_method(OBJ1<type_> obj)
    {
      //with another intermediate class, call one of OBJ1's public methods
      anotherClass::call(obj);
    }
};

int main() {
    OBJ3 obj3;
    OBJ1<int> obj1;
    OBJ1<double> objd;
    obj3.magic_method(obj1);
    obj3.magic_method(objd);
}
于 2012-10-03T12:24:20.623 に答える
0

また

void magic_method(OBJ1<int>& my_obj)
{
  //with another intermediate class, call one of OBJ1's public methods
}

OBJ1または、ジェネリックにしたい場合:

template<typename T>
void magic_method(OBJ1<T>& my_obj)
{
  //with another intermediate class, call one of OBJ1's public methods
}
于 2012-10-03T09:55:58.787 に答える