构造函数没有被调用?

时间:2012-02-18 13:27:53

标签: c++ visual-studio-2010 constructor

我一直盯着我的代码,我无法弄清楚为什么我的构造函数不会被调用。

它完全忽略了我的构造函数(我已经调试了调试器)。

这是我的testapp:

using namespace MyEngine;

int _tmain(int argc, _TCHAR* argv[])
{
    TestManager* testMgr = new TestManager();
    testMgr->RunAllTests();

    delete testMgr;

    getchar();
    return 0;
}

TestManager.h:

namespace MyEngine
{

    class TestManager 
    {
    public:
        TestManager();
        TestManager(uint64_t RepeatTimes);
        ~TestManager();

        bool RunAllTests();

        bool RunMemoryTests();

    private:
        Engine* mEngine;
        ILogManager* mLogger;

        MemoryTestManager* mMemTestMgr;
        uint64_t mRepeatTimes;

    };

}

和TestManager.cpp

namespace MyEngine
{

    TestManager::TestManager()
    {
        TestManager(1);
    }

    TestManager::TestManager(uint64_t RepeatTimes)
    {
        if (RepeatTimes>0)
            mRepeatTimes = RepeatTimes;
        else 
        {
            mRepeatTimes = 1;
        }

        mEngine = Engine::GetEngine();
        mMemTestMgr = new MemoryTestManager();
    }

    TestManager::~TestManager()
    {

    }


    /* Runs all testing modules */
    bool TestManager::RunAllTests()
    {
        bool res = true;

        /* Init Engine */
        if(mEngine->Init(0,0,0))
        {
            res = true;
            res && mEngine->GetRenderManager()->Init();
            res && mLogger->Init(true,true);
            res && mEngine->GetMemoryManager()->Init(false);

        }
        else
            return false;

        /* Start Engine */
        mEngine->Start();

        /* Get logger */
        mLogger = mEngine->GetLogger();

        /* Run Memory Tests */
        res &= RunMemoryTests();

        if (res)
            mLogger->LogInfo("TEST: TESTING SUCCESSFULL");
        else
            mLogger->LogError("TEST: TESTING FAILED");

        return res;
    }

    /* Runs all memory tests */
    bool TestManager::RunMemoryTests()
    {
        bool res = true;

        res &= mMemTestMgr->AllocateTest();
        res &= mMemTestMgr->ReferenceTest();

        if (res)
            mLogger->LogInfo("TEST: RunMemoryTests SUCCESSFULL");
        else
            mLogger->LogError("TEST: RunMemoryTests FAILED");

        return res;
    }

}

4 个答案:

答案 0 :(得分:5)

你不能从同一个类中调用另一个构造函数。我将init代码重构为一个单独的方法,并从两个构造函数中调用它:

namespace MyEngine
{

    TestManager::TestManager()
    {
        Init(1);
    }

    TestManager::TestManager(uint64_t RepeatTimes)
    {
        Init(RepeatTimes);
    }

    void TestManager::Init(uint64_t RepeatTimes)
    {
        if (RepeatTimes>0)
            mRepeatTimes = RepeatTimes;
        else 
        {
            mRepeatTimes = 1;
        }

        mEngine = Engine::GetEngine();
        mMemTestMgr = new MemoryTestManager();
    }
}

答案 1 :(得分:3)

当您在TestManager(1);)构造函数中调用TestManager::TestManager(时,您正在使用构造函数TestManager::TestManager(uint64_t)创建另一个 TestManager实例。

您无法在C ++上执行此操作,您必须创建 init 方法,将实例变量设置为您想要的任何值,或使用可选参数:

TestManager(uint64_t RepeatTimes = 0);

然后,如果您创建一个没有参数的TestManager实例,您将使用0作为uint64_t参数调用TestManager::TestManager(uint64_t)构造函数。

答案 2 :(得分:0)

您无法从重载的构造函数中调用默认构造函数。你为什么不简单地创建这样的对象:

TestManager* testMgr = new TestManager(1);

答案 3 :(得分:0)

在这种情况下,使用默认参数(根据fontanini的答案)将执行您想要的操作。

但是如果这是一个简化的例子并且您确实想要委托给另一个构造函数,那么在C ++ 03中这是不可能的 - 行TestManager(1)只构造一个未使用的临时对象(和行除非TestManager(uint64_t)构造函数有副作用,否则可能会被优化掉。

但是,您可以使用C ++ 11编译器和以下语法执行您的目标:

TestManager::TestManager() :
    TestManager(1)
{
}