【问题标题】:c++ call outside class functionsc++调用外部类函数
【发布时间】:2014-07-09 14:47:06
【问题描述】:

Inside 类有没有办法直接调用 Outside 类函数? 而不必检查布尔值是否为真。

像这样:

类内

class Inside {

public:
    Inside()
    {
    }
    ~Inside()
    {
    }

    Update()
    {
        if(buttonpress)
        {
         //call Outside::LoadGame();
        }
    }

}

课外

class Outside {

public:
   Outside();
   ~Outside();
   void LoadGame()
   {
     //Load Game
   }

   Inside* insideObject;

   void Update()
   {
     insideObject->Update();
   }


}

【问题讨论】:

  • 通过外部*作为更新参数
  • 问题不清楚,请描述的更详细。
  • 你到底想做什么?你说的是继承吗?
  • 您要解决的具体问题是什么?现在它看起来像是一个类设计缺陷。也许您想直接在Outside::Update() 中调用Outside::LoadGame()
  • 您的Inside 的问题在于它不是真正的inside Outside

标签: c++ class call


【解决方案1】:

如果没有Inside::Update 函数引用Outside 对象,您就不可能这样做。

最简单的解决方案是调用Update 传递this 作为参数:

class Inside
{
    ...

    void Update(Outside* outside)
    {
        outside->LoadGame();
    }
};

// ...

void Outside::Update()
{
    inside->Update(this);
}

另一种解决方案是在Outside 类中创建inside 对象时将this 作为参数传递给构造函数。


但是,这将两个类紧密地结合在一起,这可能是设计不佳的标志。在你实现它之前,你应该问自己“我真的需要这种紧密耦合吗?有没有其他方法可以通过更好的设计解决问题?问题是什么我还是试着解决?”

【讨论】:

  • 谢谢,这正是我想要的。不知道您可以将“this”作为参数传递。
  • @SundayBrowsing this 是一个变量(实际上,它是非静态成员函数的隐藏第一个参数),就像其他变量一样,您不必自己声明它。
【解决方案2】:

如果要访问静态方法:

文件Outside.h

class Outside {
public:
  static void startGame();
}

文件 Inside.h

#include "Outside.h"

class Inside {
public:
  void update() { Outside::startGame(); }
}

相反,如果你想访问特定的实例,你有:

文件Outside.h

class Outside {
public:
  void startGame();
}

文件 Inside.h v1

#include "Outside.h"

class Inside {
public:
   void update() { o.startGame(); }
private:
   Outside o;
}

文件 Inside.h v2

#include "Outside.h"

class Inside {
public:
   void update(const Outside& o) { o.startGame(); }
}

您的具体案例:

class Inside {
public:
    Inside() { }
    ~Inside(){ }
    Update(Outside* o) {
        if(buttonpress) {
           o->LoadGame();
        }
    }
}

class Outside {
public:
   Outside();
   ~Outside();
   void LoadGame() { }
   Inside* insideObject;
   void Update() {
     insideObject->Update(this);
   }
}

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2015-05-12
    相关资源
    最近更新 更多