c++ 当被同一个类的静态方法调用时,构造函数不被调用,但是仍然产生一个示例[关闭]

7lrncoxx  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(109)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
globals.h

  1. // include statements
  2. #include <iostream>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. // proprocessor definitions
  6. #define PREPROC_TEST "TESTING PROPROCESSOR STATEMENT ACCESSIBILITY"

tetris.h

  1. #include "globals.h"
  2. /* Format as singleton */
  3. class Tetris {
  4. /* PRIVATE VARIABLES */
  5. static Tetris* pInstance;
  6. /* PRIVATE METHODS */
  7. Tetris(); // constructor
  8. bool GameLoop();
  9. public:
  10. /* PUBLIC METHODS */
  11. static Tetris* GetInstance();
  12. void HelloWorld();
  13. };

tetris.cpp

  1. #include "tetris.h"
  2. /* PRIVATE STATIC VARIABLES */
  3. Tetris* Tetris::pInstance;
  4. /* ----------------------------[PRIVATE METHODS]-----------------------------*/
  5. /* PRIVATE CONSTRUCTOR */
  6. Tetris::Tetris()
  7. {
  8. std::cout << "tetris.cpp [constructor]: " << PREPROC_TEST << std::endl;
  9. printf("Initialised instance of the 'Tetris' class\n");
  10. }
  11. /* [PRIVATE] */
  12. bool Tetris::GameLoop()
  13. {
  14. return true;
  15. }
  16. /* ----------------------------[PUBLIC METHODS]----------------------------- */
  17. /* [PUBLIC STATIC] */
  18. Tetris* Tetris::GetInstance()
  19. {
  20. if (Tetris::pInstance != nullptr)
  21. Tetris::pInstance = new Tetris;
  22. return Tetris::pInstance;
  23. }
  24. /* [PUBLIC] */
  25. void Tetris::HelloWorld()
  26. {
  27. printf("tetris.cpp: %s\n", PREPROC_TEST);
  28. }

main.cpp

  1. #include "globals.h"
  2. #include "tetris.h"
  3. #include "iostream"
  4. #include "SDL2/SDL.h"
  5. int main(int argc, char** argv)
  6. {
  7. printf("main.cpp: %s\n", PREPROC_TEST);
  8. Tetris* instance = Tetris::GetInstance();
  9. instance->HelloWorld();
  10. instance->HelloWorld();
  11. instance->HelloWorld();
  12. return EXIT_SUCCESS;
  13. }

输出:

  1. // main.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
  2. // tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
  3. // tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
  4. // tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY

在私有构造函数范围内发出的Print语句不会出现在命令行中。
'Tetris'类被格式化为单例。其中一个公共静态方法Tetris::GetInstance将创建一个示例(如果示例不存在),并返回一个指向新示例的指针。如果Tetris::GetInstance在示例已经存在时被调用,它将返回现有示例。
在任何时候,用户都不打算自己创建俄罗斯方块类的示例,因此构造函数是私有的。虽然静态方法看起来确实成功地创建了一个示例,但它似乎以某种方式绕过了构造函数,因为在构造函数的作用域内编写的代码不会被执行。
我尝试将构造函数设为公共的,但没有观察到输出有任何变化。

qf9go6mv

qf9go6mv1#

我发现错误是在'Tetris::GetInstance'本身

  1. if (Tetris::pInstance != nullptr)
  2. Tetris::pInstance = new Tetris;

实际上应该是这样的:

  1. if (Tetris::pInstance == nullptr)
  2. Tetris::pInstance = new Tetris;

通过此修改,其按预期工作。

相关问题