C++ C++;指针和向量

C++ C++;指针和向量,c++,pointers,casting,C++,Pointers,Casting,我有一个向量*,我不完全确定它是如何被访问的。我正在声明MyType*var=newmytype(params),在创建它的类中可以很好地访问它。数字显示得很好。当我返回这些向量并试图从另一个类(intmain()method)访问它时,我得到的是完全不同的数字 我在int main()中访问它的方式是 MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]); MyType*Temp=reinterpret_

我有一个
向量*
,我不完全确定它是如何被访问的。我正在声明
MyType*var=newmytype(params)
,在创建它的类中可以很好地访问它。数字显示得很好。当我返回这些向量并试图从另一个类(
intmain()
method)访问它时,我得到的是完全不同的数字

我在
int main()
中访问它的方式是

MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]);
MyType*Temp=reinterpret_cast(&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;
}
int main(数组^args)
{
MyAPI;
std::vector*RetVector=API.GetVector();
对于(无符号整数i=0;isize();i++)
{
MyClass*Temp=重新解释投射(&RetVector[i]);
cout值push_back(Tmp);
}
返回Ret;
}

您不需要重新解释
强制转换
。任何时候你都要仔细考虑你为什么要这样做。如果是为了克服编译器给出的类型警告,那么该警告可能完全有效

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

// NAUGHTY!
MyType* Temp = reinterpret_cast<MyType*>(&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<MyType*> *ReturnedVector = some_function_that_returns_a_vector_pointer();

// NAUGHTY!
MyType* Temp = reinterpret_cast<MyType*>(&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) );
    }
}
把这个换掉

for (unsigned int i = 0; i < RetVector->size(); i++)
{
    MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
    std::cout << Temp->value << std::endl;
}
for(无符号int i=0;isize();i++)
{
MyClass*Temp=重新解释投射(&RetVector[i]);
std::cout value empty())
{
MyClass*Temp=RetVector->pop_back();
std::cout value只需替换此

for (unsigned int i = 0; i < RetVector->size(); i++)
{
    MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
    std::cout << Temp->value << std::endl;
}
for(无符号int i=0;isize();i++)
{
MyClass*Temp=重新解释投射(&RetVector[i]);
std::cout value empty())
{
MyClass*Temp=RetVector->pop_back();

std::cout value请输入一些代码以便理解,您到底在做什么…如果没有强制转换就不能工作,那么强制转换也是错误的。请输入一些代码以便理解,您到底在做什么…如果没有强制转换就不能工作,那么强制转换也是错误的。如果确实需要指针,那么它们应该y应该被包装在适当的智能指针中,否则需要手动删除它们。同样在c++11中,人们不应该真正担心直接返回向量,因为它将被移动而不是复制。因此函数签名可能应该是std::vector MyApi::GetVector();甚至是std::vector MyApi::GetVector();如果确实需要指针,则可能需要将它们包装在适当的智能指针中,否则需要手动删除它们。同样在c++11中,不必担心直接返回向量,因为向量将被移动而不会被复制。因此函数签名可能应该是std::vector MyApi::GetVector();甚至std::vector MyApi::GetVector();。
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;
}