【问题标题】:How to access private variable from object instantiated inside class如何从类内实例化的对象访问私有变量
【发布时间】:2016-06-11 22:29:10
【问题描述】:

我正在尝试更改对象内部类的私有变量,该对象在该类内部初始化。 我的意图可以从下面的简单示例中得出。 从obj 调用的Increment 应该增加BaseClass::stuff。

template <typename ObjectType>
class BaseClass{
 public:

  int Increment(){
    return obj.Increment();
  }

 private:
  int stuff = 0;
  ObjectType obj;
};

class ObjectType{
  public:     
   int Increment ()
   {
      return BaseClass<ObjectType>::stuff++;
   };
};

int main () {
  BaseClass<ObjectType> base;
  base.Increment(); // should increase stuff by 1;
}

我能想到的一种方法是将内容作为参数传递给obj.Increment()。

有没有一种方法可以在不将其作为参数传递的情况下实现这一点?

【问题讨论】:

  • 使用friend关键字?
  • 一个对象不知道它属于哪个对象。如果你添加这些知识,你通常会得到非常脆弱的代码。

标签: c++ class templates object


【解决方案1】:

您的示例有一些错误。
修复并添加 friend 说明符后,它应该如下所示:

template <typename ObjectType>
class BaseClass{
public:
    friend ObjectType;

    int Increment(){
        return obj.Increment();
    }

private:
    static int stuff;
    ObjectType obj;
};

template<typename T>
int BaseClass<T>::stuff = 0;

class ObjectType{
public:     
    int Increment ()
    {
        return BaseClass<ObjectType>::stuff++;
    };
};

int main () {
    BaseClass<ObjectType> base;
    base.Increment(); // should increase stuff by 1;
}

【讨论】:

  • 我试过运行代码,没有成功。 ObjectType 试图接近 BaseClass::stuff (不是实例化对象)似乎是问题我该如何解决这个问题?
  • 答案中的代码在clang 和GCC 上编译。我没有得到你的评论,抱歉。
  • 哦,我错过了 template int BaseClass::stuff = 0 部分。谢谢:)
【解决方案2】:

1、stuff不是静态public成员,所以不能直接用ClassName::实现,id要使用"BaseClass::stuff++",请将其改为static public,这样所有的objects的 BaseClass 共享一个东西。

2,否则,ObjectType 需要“知道”BaseClass,ObjectType::Increment 可以通过 BaseClass 的一些帮助功能增加 BaseClass 的内容,或者使 ObjectType 成为 BaseClass 的朋友。

ObjectType 自己的 BaseClass 的示例代码:

template <typename ObjectType>
class BaseClass{
public:
    void increaseStuff() {++stuff;}
.... 
}

class ObjectType
{
    BaseClass<ObjectType>& itsBase;
public:    
    ObjectType(BaseClass<ObjectType>& base) : itsBase(base) 
    int Increment ()
    {
       return itsBase.increaseStuff();
    };
};

但我觉得这个设计看起来很奇怪,意思是“我想通过别人改变我拥有的东西”,为什么不直接改变我的东西。 在这种情况下,我认为 ObjectType 拥有的东西更好。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2010-10-23
    • 2010-09-25
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多