**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
globals.h
// include statements
#include <iostream>
#include <string.h>
#include <stdlib.h>
// proprocessor definitions
#define PREPROC_TEST "TESTING PROPROCESSOR STATEMENT ACCESSIBILITY"
tetris.h
#include "globals.h"
/* Format as singleton */
class Tetris {
/* PRIVATE VARIABLES */
static Tetris* pInstance;
/* PRIVATE METHODS */
Tetris(); // constructor
bool GameLoop();
public:
/* PUBLIC METHODS */
static Tetris* GetInstance();
void HelloWorld();
};
tetris.cpp
#include "tetris.h"
/* PRIVATE STATIC VARIABLES */
Tetris* Tetris::pInstance;
/* ----------------------------[PRIVATE METHODS]-----------------------------*/
/* PRIVATE CONSTRUCTOR */
Tetris::Tetris()
{
std::cout << "tetris.cpp [constructor]: " << PREPROC_TEST << std::endl;
printf("Initialised instance of the 'Tetris' class\n");
}
/* [PRIVATE] */
bool Tetris::GameLoop()
{
return true;
}
/* ----------------------------[PUBLIC METHODS]----------------------------- */
/* [PUBLIC STATIC] */
Tetris* Tetris::GetInstance()
{
if (Tetris::pInstance != nullptr)
Tetris::pInstance = new Tetris;
return Tetris::pInstance;
}
/* [PUBLIC] */
void Tetris::HelloWorld()
{
printf("tetris.cpp: %s\n", PREPROC_TEST);
}
main.cpp
#include "globals.h"
#include "tetris.h"
#include "iostream"
#include "SDL2/SDL.h"
int main(int argc, char** argv)
{
printf("main.cpp: %s\n", PREPROC_TEST);
Tetris* instance = Tetris::GetInstance();
instance->HelloWorld();
instance->HelloWorld();
instance->HelloWorld();
return EXIT_SUCCESS;
}
输出:
// main.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
// tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
// tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
// tetris.cpp: TESTING PROPROCESSOR STATEMENT ACCESSIBILITY
在私有构造函数范围内发出的Print语句不会出现在命令行中。
'Tetris'类被格式化为单例。其中一个公共静态方法Tetris::GetInstance
将创建一个示例(如果示例不存在),并返回一个指向新示例的指针。如果Tetris::GetInstance
在示例已经存在时被调用,它将返回现有示例。
在任何时候,用户都不打算自己创建俄罗斯方块类的示例,因此构造函数是私有的。虽然静态方法看起来确实成功地创建了一个示例,但它似乎以某种方式绕过了构造函数,因为在构造函数的作用域内编写的代码不会被执行。
我尝试将构造函数设为公共的,但没有观察到输出有任何变化。
1条答案
按热度按时间qf9go6mv1#
我发现错误是在'Tetris::GetInstance'本身
实际上应该是这样的:
通过此修改,其按预期工作。