我有一个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;
}
答案 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对数据排列方式的期望,所以你运气不好。