【问题标题】:C++ Use "this" as a parameter?C++ 使用“this”作为参数?
【发布时间】:2014-08-08 06:26:29
【问题描述】:

所以,我试图在我的 C++ 程序中重现我在 Java 中学到的一件事,但我就是无法完成这项工作!

这是我想做的一个例子:

class Game{
public:
    int screenWidth, screenHeight;
    Screen* titleScreen;
    void createScreen(){
        titleScreen = new Screen(this);
    }
}

class Screen{
public:
    Game* game;
    Rect quad1;
    Screen(Game* game){
        this->game = game;
        quad1.x = game->screenWidth/2;
    }
}

我什至不确定这段代码是否正确,因为我现在创建它只是为了显示我想要做什么。

所以,基本上,我想做的是在“屏幕”中为“游戏”创建一个引用,这样我就可以使用它的属性和方法(在本例中为屏幕宽度),即使正在实例化“屏幕”在“游戏”里面。我在 Java 中做了类似的事情并且效果很好,但是对于 C++,我得到了很多错误,我什至不知道如何解释它们......我尝试使用指针作为参数,而不是使用“this”我试过使用“&this”,但它们都不起作用,我得到了几乎相同的错误......

那么,我做错了什么?我怎样才能使这项工作?这在 C++ 中是否可行?

【问题讨论】:

  • 您的构造函数按值获取参数,但您传递的是一个指针。看起来您希望通过引用来获取论点,如您的帖子中所述。
  • 如果您想要参考,请使用参考。 Screen(Game& game); 或更好:Screen(const Game& game);
  • 您在执行此操作时可能应该read this。有些事情告诉我你会想知道为什么当你为Game添加析构函数时事情会崩溃
  • @WhozCraig:或者,使用 C++11,The Rule of Zero
  • @CaptainObvlious 但是,如果我使用Game &game,我将只能将其用作该函数(在本例中为构造函数)的参考,不是吗?但是,如果我想在另一个函数中使用相同的引用,Game 没有调用,但是使用与Game 调用相同的Screen 对象的完全不同的类怎么办?或者即使 Game 是调用该函数的那个​​,假设我在 Screen 中有 100 个方法,每个方法使用来自 Game 的 100 个属性,我必须将每个属性作为参数传递给每个方法?

标签: c++ class object parameters


【解决方案1】:

使用前向声明,并在定义它需要的东西之后定义函数。

class Screen; // Forward declaration

class Game{
public:
    int screenWidth, screenHeight;
    Screen * titleScreen;
    void createScreen();
}

class Screen{
public:
    Game* game;
    Rect quad1;
    Screen(Game *game){
        this->game = game;
        quad1.x = game->screenWidth/2;
    }
}

// Out-of-line definition.
// This should be declared "inline" if it's in a header file.
void Game::createScreen(){
    titleScreen = new Screen(this);
}

【讨论】:

  • 我在每个类的头文件中声明所有类及其属性/方法,并在 .cpp 文件中定义它们,因此“Game.h”包括“Screen.h”和“Screen.h”包括“Game.h”(当然,我所有的标题上都有一个“pragma once”)。
  • @Deive_Ex #include 无论你是否使用#pragma once 都会贪婪地工作。如果尚未打开每个头文件,编译器将打开它。循环依赖不被编译器解析;你需要按照这个模式自己做。
【解决方案2】:

a) 前向声明 Game 类。

b) 使Screen(Game *game) 构造函数接受一个指针而不是一个对象,因为您正在传递这个指针。

参考以下示例

http://ideone.com/J8He9f

【讨论】:

  • 实际上,我在每个类的头文件中声明所有类及其属性/方法,并在 .cpp 文件中定义它们,因此“Game.h”包括“Screen.h” " 并且 "Screen.h" 包括 "Game.h" (当然,我所有的标题上都有一个“pragma once”)。我尝试使用指针作为参数,但我得到了同样的错误(另外,VS 说如果我使用指针,我不能传递“this”)
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多