1

我有一个类,其中包含一个结构。我在类上有一个方法,它创建了这个结构的新对象,将它作为指针返回。

我在这个类中有另一个方法,它接受一个指向这个结构的指针并打印出它的数据。

唯一的问题是,当我尝试打印出来时,控制台中会出现一些奇怪的文本。

代码示例(不是实际代码,而是它的原理):

// Header

class TestClass
{
    public:

        struct TestStruct
        {
            int ID;
            string Name;
        };

        TestClass::TestStruct* CreateStruct(string name, int id);
        void PrintStruct(TestClass:TestStruct* testStruct);
}

// C++ File

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{

    TestStruct testStruct;

    testStruct.ID = id;
    testStruct.Name = name;

    TestClass::TestStruct *pStruct = &testStruct;

    return pStruct;

};

void TestClass::PrintStruct(TestClass::TestStruct* testStruct)
{

    cout << (testStruct)->ID << "\n";
    cout << (testStruct)->Name << "\n";

};

int Main()
{

    TestClass tClass;

    tClass.PrintStruct(tClass.CreateStruct("A name", 1));

}
4

1 回答 1

3

您正在返回一个指向局部变量的指针,并遇到未定义的行为

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{
    TestStruct testStruct;
    //...
    TestClass::TestStruct *pStruct = &testStruct;
    return pStruct;
}   //testStruct is destroyed here
    //the pointer pStruct is invalid

要使其工作,您可以返回智能指针或动态分配内存以延长对象的生命周期。请记住,您必须delete明确地这样做:

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{

    TestStruct* testStruct = new TestStruct;

    testStruct->ID = id;
    testStruct->Name = name;

    return testStruct;

};

另外,请认真考虑您是否真的需要指针。尽可能选择自动变量。如果我是你,我会这样做:

TestClass::TestStruct TestClass::CreateStruct(string name, int id)
{

    TestStruct testStruct;
    testStruct.ID = id;
    testStruct.Name = name;
    return testStruct;
};

void TestClass::PrintStruct(const TestClass::TestStruct& testStruct) const
{
    cout << testStruct.ID << "\n";
    cout << testStruct.Name << "\n";
};
于 2012-06-22T07:13:36.923 回答