конструктор не вызывается? - PullRequest
2 голосов
/ 18 февраля 2012

Я смотрел на свой код и не могу понять, почему мой конструктор не вызывается.

Это просто полное игнорирование моего конструктора (я проверил пошагово с помощью отладчика).

Вот мой тестапп:

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 ]

5 голосов
/ 18 февраля 2012

Вы не можете вызвать другой конструктор из того же класса.Я бы преобразовал код инициализации в отдельный метод и вызвал бы его из обоих конструкторов:

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();
    }
}
3 голосов
/ 18 февраля 2012

Когда вы вызываете TestManager(1); внутри вашего TestManager::TestManager() конструктора, вы создаете другой экземпляр TestManager, используя конструктор TestManager::TestManager(uint64_t).

Вы не можете сделать это на C ++, вам нужно создать либо метод init , где вы устанавливаете переменные экземпляра на любое значение, либо используете необязательные параметры:

TestManager(uint64_t RepeatTimes = 0);

Затем, если вы создадите экземпляр TestManager без аргументов, вы будете вызывать конструктор TestManager::TestManager(uint64_t) с 0 в качестве аргумента uint64_t.

0 голосов
/ 18 февраля 2012

Использование аргумента по умолчанию (в соответствии с ответом fontanini) будет делать то, что вы хотите в этом случае.

Но если это упрощенный пример и вы действительно хотите делегировать другому конструктору, то это невозможно в C ++ 03 - строка TestManager(1) просто создает временный объект, который не используется (и строка, вероятно, будет оптимизировать, если у конструктора TestManager(uint64_t) нет побочных эффектов).

Однако вы можете сделать то, к чему стремитесь, с помощью компилятора C ++ 11 и следующего синтаксиса:

TestManager::TestManager() :
    TestManager(1)
{
}
0 голосов
/ 18 февраля 2012

вы не можете вызвать конструктор по умолчанию из перегруженного конструктора. Почему бы вам просто не создать свой объект, подобный этому:

TestManager* testMgr = new TestManager(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...