我有一个名为Coverage的类。它有一些数据类型字符串的变量和一些带有返回类型字符串的函数。
此类用于其他头文件。我想将类转换为C 结构。其他头文件正在使用函数中的类对象。我想在远处更改类,而不必在其他头文件中进行更改。
如果函数是
那就好string ABC(Coverage* coverage);
我的结构应该作为一个行为的类;但无法在结构中创建函数,因为在C中不建议这样做。
class Coverage
{
std::string country;
std::string KpRuntimeDir();
std::string CRtimeDir();
std::string RtimeDir();
};
将类转换为,例如:
struct Coverage n{
char country[];
/* [...] */
};
答案 0 :(得分:3)
我想到的唯一方法是将类重写为结构(仅变量成员)并在结构外部定义函数(而不是方法)。但是如果你有私有和公共方法,一些seld-defined构造函数,那么它似乎毫无意义,你永远不会得到相同的安全性和功能。
struct Coverage{
char country[256];
--------
};
char* RtimeDir(Coverage* c);
但是在这种情况下,可以使用任何指针进行调用,这将导致运行时错误。
答案 1 :(得分:2)
您应声明extern "C"
结构并将Coverage
的实例转换为一个:
extern "C" {
struct CoverageAsACStruct
{
char country[SOME_DEFINED_CONSTANT_COUNTRY];
char KpRuntimeDir[SOME_DEFINED_CONSTANT_RUNTDIR];
char CRtimeDir[SOME_DEFINED_CONSTANT_CRTIMEDIR];
char RtimeDir[SOME_DEFINED_CONSTANT_RTIMEDIR];
};
}
class Coverage
{
std::string country();
std::string KpRuntimeDir();
std::string CRtimeDir();
std::string RtimeDir();
void buildCStructure( struct CoverageAsACStruct* dst ) const;
};
void Coverage::buildCStructure( struct CoverageAsACStruct* dst ) const
{
std::string cached_country = country();
if (cached_country.size()+1 > sizeof(dst->country))
// error?
// same for other fields
::strcpy(dst->country, cached_country.c_str());
// same for other fields
}
每当您需要将Coverage
实例(我们称之为cov
)传递给C函数f()
时,请传递它:
struct CoverageAsACStruct ccov;
cov.buildCStructure(&ccov);
f(&ccov);
您甚至可以将其嵌入Coverage
的成员函数中。
答案 2 :(得分:2)
我也不确定你为什么要这样做,但你也可以通过功能指针(但更喜欢条件编译),在用C语言实现所有C ++之后做到这一点。 在下面的代码中,我试图通过使用函数指针将函数添加到C结构来模拟C中的C ++结构。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
class Someclass{
string some_str;
public:
string get();
void set(string str);
};
*/
struct SomeStruct;
typedef char *(*Getter)(struct SomeStruct *);
typedef void (*Setter)(struct SomeStruct *, char *);
typedef void (*Initialize)(struct SomeStruct *);
typedef struct SomeStruct{
char some_chr[1024];
Getter get;
Setter set;
Initialize init;
}STR;
char * Get(STR *SStr){
return SStr->some_chr;
}
void Set(STR *SStr, char *str){
strncpy(SStr->some_chr,str,strlen(str)+1);
}
void Init(STR *STRstr){
STRstr->get = Get;
STRstr->set = Set;
}
int main(){
STR SStr,Next_str;
SStr.init = Init;
SStr.init(&SStr);
SStr.set(&SStr,"Example");
printf("%s\n",SStr.get(&SStr));
Next_str.init = Init;
Next_str.init(&Next_str);
Next_str.set(&Next_str,"Next_Example");
printf("%s\n",Next_str.get(&SStr));
return 0;
}