0

我有一个vector<MyType*>*,但我不完全确定它是如何被访问的。我正在声明MyType* var = new MyType(params),它可以在创建它的类中正常访问。数字吐出来就好了。当我返回这些向量并尝试从另一个类(int main()方法)访问它时,我得到的数字完全不同。

我访问它的方式int main()

MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]);

这里有什么遗漏吗?我是 C++ 新手。

编辑:添加代码以进行澄清。这是我的主要方法:

int main(array<System::String ^> ^args)
{
    MyAPI API;
    std::vector<MyClass*>* RetVector = API.GetVector();

    for (unsigned int i = 0; i < RetVector->size(); i++)
    {
        MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
        cout << Temp->value << endl;
    }
    return 0;
}

这是另一个类中的向量返回方法:

vector<MyClass*>* MyAPI::GetVector()
{
vector<MyClass*>* Ret = new vector<MyClass*>();
for (int i = 0; i < 100; i++)
{
MyClass* Tmp = new MyClass(params);
Ret->push_back(Tmp);
}
return Ret;
}
4

2 回答 2

3

你不应该需要reinterpret_cast. 每当您这样做时,请仔细考虑为什么要这样做。如果要克服编译器给您的类型警告,则该警告可能完全有效。

vector<MyType*> *ReturnedVector = some_function_that_returns_a_vector_pointer();

// NAUGHTY!
MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]);

这是不好的。您假设这ReturnedVector是一个指向 的数组的指针vector<MyType*>,并请求i该数组的第 th 个元素。然后获取该元素的地址 ( MyType**) 并将其转换为MyType*. 难怪你的数字不同。你很幸运,你的程序没有吐出众所周知的假人。

请注意,&ReturnedVector[i]与 相同ReturnedVector + i

这是正确的方法。您取消引用指针以获取 a vector<MyType*>,然后调用其数组索引运算符来检索第ith 元素。当然,那个元素是 a MyType*,不需要强制转换。

// NICE!
MyType* Temp = (*ReturnedVector)[i];

编辑,因为您现在已经发布了一些代码......从函数中填充和返回向量的一种更常见的方法是通过引用传递它。这样你就不用处理指向向量的指针和丑陋的取消引用,并且你不需要在之后删除向量。尝试这个:

void MyAPI::GetVector( vector<MyClass*> & vec )
{
    vec.clear();
    vec.reserve(100);

    for (int i = 0; i < 100; i++)
    {
        vec.push_back( new MyClass(params) );
    }
}

更新。当我写这个答案时,我对返回值优化不是很熟悉,因此我对返回向量时可能发生的复制感到偏执。这实际上不是问题。现代方法是简单地返回向量:

vector<MyClass*> MyAPI::GetVector()
{
    vector<MyClass*> vec;
    vec.reserve(100);
    for (int i = 0; i < 100; i++)
    {
        vec.push_back( new MyClass(params) );
    }
    return vec;
}

std::shared_ptr而且,随着 C++11 变得更加正常,我们开始放弃原始指针,转而支持std::unique_ptr移动语义:

vector<unique_ptr<MyClass> > MyAPI::GetVector()
{
    vector<unique_ptr<MyClass> > vec;
    vec.reserve(100);
    for (int i = 0; i < 100; i++)
    {
        vec.push_back( std::move( unique_ptr<MyClass>(new MyClass(params)) ) );
    }
    return vec;
}
于 2012-10-26T04:13:38.900 回答
0

只是替换这个

for (unsigned int i = 0; i < RetVector->size(); i++)
{
    MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
    std::cout << Temp->value << std::endl;
}

while(!RetVector->empty())
{
    MyClass* Temp = RetVector->pop_back();
    std::cout << Temp->value << std::endl;
}
于 2012-10-26T06:01:01.940 回答