将对象的std :: vector转换为结构数组

时间:2010-03-02 22:21:17

标签: c++

我有一个VS2008 C ++程序,我正在包装一个用于C ++程序的C API。 C API期望一个TABLE_ENTRY值数组,如下所示。

除了将每个MyClass结构中的数据复制到MyClassCollection::GetTable()中的新TABLE_ENTRY结构之外,有没有办法获得我正在寻找的功能?

谢谢, PaulH

struct TABLE_ENTRY {
    const char* description;
    DWORD value;
};

class MyClass
{
public:
    MyClass( const char* desc, DWORD value ) : 
        description( desc ),
        some_value( 1 )
    {
    };

    TABLE_ENTRY* GetTable()
    {
        entry_.description = description.c_str();
        entry_.value = some_value;
        return &entry_;
    };

    TABLE_ENTRY entry_;
    std::string description;
    DWORD some_value;
};

class MyClassCollection
{
public:
    TABLE_ENTRY* GetTable()
    {
        return collection_.front()->GetTable();
    };

    void Add( MyClass* my_class )
    {
        collection_.push_back( my_class );
    }
private:
    std::vector< MyClass* > collection_;
};

int _tmain( int argc, _TCHAR* argv[] )
{
    MyClass class1( "class1", 1 );
    MyClass class2( "class2", 2 );

    MyClassCollection collection;
    collection.Add( &class1 );
    collection.Add( &class2 );

    TABLE_ENTRY* table = collection.GetTable();

    // table is to be used by the C API. Therefore, these next
    // calls should function as shown.
    TABLE_ENTRY entry1 = table[ 0 ]; // should be class1's table (works)
    TABLE_ENTRY entry2 = table[ 1 ]; // should be class2's table (full of junk)

    return 0;
}

4 个答案:

答案 0 :(得分:1)

获取一个数组:(这是C ++ 03合法的,但所有C ++ 98实现似乎也支持它)

&vec[0]

请注意,向量仍然拥有内容,因此不要删除内存或重新分配它。

答案 1 :(得分:1)

我要复制到vector<TABLE_ENTRY>并将&entries[0]传递给C API。

并且,我不会将TABLE_ENTRY存储在您的C ++类中。我只会像调用API一样制作它们,然后扔掉它们。这是因为TABLE_ENTRY复制了您复制的对象,并且它存储了一个直接 char*指向一个字符串的指针,该字符串的内存由std :: string管理。如果修改源字符串(并导致重新分配),则会有一个悬空指针。

答案 2 :(得分:0)

如果你的字段是相同的(字符串!= char *)你可以将你的对象转换为void *然后转换为带有一些偏移量的结构(以跳过VMT和其他OOP的东西)

答案 3 :(得分:0)

通过询问TABLE_ENTRY数组,API可以让您知道它希望以特定方式将数据排列在内存中。没有办法满足API对数据排列方式的期望,所以你运气不好。