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

标签 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() 之前准备这些对象,或者更准确地说,在它们运行之前准备这些对象的“最佳”方法是什么?在其他文件中使用?

最佳答案

我认为您根本不想调用 setPosition。我认为最好在构造函数中初始化它们。我假设这些特殊位置是不变的。

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

位置.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};

关于c++ - 在 main() 之前在单独的文件中初始化/准备类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26895724/

相关文章:

c++ - 为什么 C++ 编译器允许 extern 关键字与定义相结合?

c++ - 与 QSerialPort 的基本通信

python - Windows 上的 boost python 在导入 ("__main__"时崩溃);

c++ - 从链表中删除元素 (C++)

java - 创建静态方法逐个字符地比较两个字符串。如果字符串 a 中的所有字母都在字符串 b 中,则返回真。否则,则返回 false

C++ 未定义的方法引用以及如果所有内容都转到 .h 怎么办?

c - C中静态和外部存储类的内存位置

c++ - 为arm-linux-gnueabi-gcc交叉编译libcurl

java - 静态变量还是通过 Bundle 传递变量?

java - 带有程序代码的静态字段