在main()之前在单独的文件中初始化/准备类对象

时间:2014-11-12 20:12:44

标签: c++ static extern

简单地说,我试图在一个.h或.cpp文件中准备纹理和其他半常量对象,以便它们可以在其他文件中使用。我希望能够做到这样的事情:

class Position
{
private:
    int x;
    int y;

public:
    /* constructor, destructor, and other code */

    void setPosition(int x, int y) { this->x = x; 
                                     this->y = y; }
};

然后,在另一个文件中,有这样的东西:

//otherfile.extension

// I want to be able to declare these objects here...
Position specialPosition1;
Position specialPosition2;

// ...and then be able to do this somewhere where it will keep
//    this information for any other file that includes this.
specialPosition1.setPosition(25, 25);
specialPosition2.setPosition(-10, -10);

我希望能够调用他们的setPosition()方法并在同一个文件中准备它们,以便在可能的情况下在其他文件中使用。或至少能够进行设置,以便信息在其他地方使用之前就已存在。

如果我记得,让他们静态不会解决这个问题;加上我仍然没有(已知)地方调用setPosition来准备对象。我也读过一些关于 extern 的内容,虽然我对它的了解只是模糊不清。

我怎样才能在main()之前准备这些对象,或者更准确一点,在将这些对象用于其他文件之前准备这些对象的“最佳”方法是什么?

1 个答案:

答案 0 :(得分:2)

我觉得你根本不想打电话给setPosition。我认为在构造函数中初始化它们会更好。我认为这些特殊的立场是不变的。

我想你想在.h文件中将它们声明为extern,然后在.cpp中定义它们:

<强> Position.h:

struct Position {
  int x;
  int y;
  Position(int _x, int _y) : x(_x), y(_y) {}
  //...
};

<强> SpecialPositions.h:

#include "Position.h"

extern const Position specialPosition1;
extern const Position specialPosition2;

<强> SpecialPositions.cpp:

#include "SpecialPositions.h"

const Position specialPosition1{25, 25};
const Position specialPosition2{-10, -10};

<强> Main.cpp的:

#include "SpecialPositions.h"
#include <iostream>
int main() {
  std::cout << specialPosition1.x << "\n";
}

或者您可以强制编译时间常量并使用constexpr。将Position构造函数更改为constexpr

constexpr Position(int _x, int _y) : x(x_), y(_y) {}

然后在SpecialPositions.h文件中定义它们(不需要SpecialPositions.cpp):

constexpr Position specialPosition1{25, 25};
constexpr Position specialPosition2{-10, -10};