Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中扩展C结构 我有一些C结构,我想在C++中扩展,以增加一些方便性和类型安全性。例如,假设我的结构是 struct vector2D { float x, y; }; 从许多来源,我已经收集到了在C++中扭曲这个结构的最安全的方法是对它进行分类: struct Vector2D: vector2D { ... };_C++_C_Struct_Casting - Fatal编程技术网

在C++中扩展C结构 我有一些C结构,我想在C++中扩展,以增加一些方便性和类型安全性。例如,假设我的结构是 struct vector2D { float x, y; }; 从许多来源,我已经收集到了在C++中扭曲这个结构的最安全的方法是对它进行分类: struct Vector2D: vector2D { ... };

在C++中扩展C结构 我有一些C结构,我想在C++中扩展,以增加一些方便性和类型安全性。例如,假设我的结构是 struct vector2D { float x, y; }; 从许多来源,我已经收集到了在C++中扭曲这个结构的最安全的方法是对它进行分类: struct Vector2D: vector2D { ... };,c++,c,struct,casting,C++,C,Struct,Casting,到目前为止还不错。然而,我很难弄清楚如何将C结构重新解释为扩展版本。假设我有一个C函数 struct vector2D do_some_stuff(struct vector2D _a, struct vector2D _b) { ... } 在这个函数中,我想用C++表示。由于struct vector2D和vector2D的布局是相同的,我认为简单的强制转换可以工作,例如 Vector2D a = static_cast<Vector2D>(_a) 但这似乎不起作用。使用构

到目前为止还不错。然而,我很难弄清楚如何将C结构重新解释为扩展版本。假设我有一个C函数

struct vector2D do_some_stuff(struct vector2D _a, struct vector2D _b) {
 ...
}

在这个函数中,我想用C++表示。由于struct vector2D和vector2D的布局是相同的,我认为简单的强制转换可以工作,例如

Vector2D a = static_cast<Vector2D>(_a)
但这似乎不起作用。使用构造函数会生成可怕的样板代码

如果可能的话,正确的方法是什么


澄清:do_有些东西是C函数,只能从C代码中调用

喜欢组合而不是继承。也就是说,改变C++类VC++中包含C结构向量的实例2D,并将其接口为:

class Vector2D {
  vector2D p;
public:
  vector2D& getP() { return p; }
  vector2D const& getP() const { return p; }
  float& x() { return p.x; }
  float& y() { return p.y; }
  float const& x() const { return p.x; }
  float const& y() const { return p.y; }
  // ...
};
然后调用C函数,如下所示:

Vector2D v1;
Vector2D v2;
...
auto p = do_some_stuff(v1.getP(), v2.getP());

喜欢组合而不是继承。也就是说,改变C++类VC++中包含C结构向量的实例2D,并将其接口为:

class Vector2D {
  vector2D p;
public:
  vector2D& getP() { return p; }
  vector2D const& getP() const { return p; }
  float& x() { return p.x; }
  float& y() { return p.y; }
  float const& x() const { return p.x; }
  float const& y() const { return p.y; }
  // ...
};
然后调用C函数,如下所示:

Vector2D v1;
Vector2D v2;
...
auto p = do_some_stuff(v1.getP(), v2.getP());
然而,我很难弄清楚如何将C结构重新解释为扩展版本

嗯,继承不是这样工作的:您的子类是您的母类的一个特化,因此您可以将Vector2D解释为Vector2D,但不能反过来解释

想想看:如果扩展数据一开始就不存在,那么它应该从哪里来

您可以实现一个构造函数或cast操作符,它接受vector2d来初始化一个新的vector2d

除了这个之外,我会说你的整个努力都是有问题的,因为它是基于误解:你正在扩展的结构现在是C++类,不同于C类型。p> 然而,我很难弄清楚如何将C结构重新解释为扩展版本

嗯,继承不是这样工作的:您的子类是您的母类的一个特化,因此您可以将Vector2D解释为Vector2D,但不能反过来解释

想想看:如果扩展数据一开始就不存在,那么它应该从哪里来

您可以实现一个构造函数或cast操作符,它接受vector2d来初始化一个新的vector2d


除了这个之外,我会说你的整个努力都是有问题的,因为它是基于误解:你正在扩展的结构现在是C++类,不同于C类型。p> 经过一些实验后,我找到了解决方法:

Vector2D v = *reinterpret_cast<Vector2D*>(&_v);

但是juanchopanza建议使用非成员函数可能是更好的方法

经过一些实验后,我找到了解决方法:

Vector2D v = *reinterpret_cast<Vector2D*>(&_v);

但是juanchopanza建议使用非成员函数可能是更好的方法

是一个纯C函数,即外部C重新解释,找到父类型可以通过引用或指针来表示参数,但不是由值来表示……从许多源,我已经收集到在C++中扭曲这个结构的最安全的方法是对它进行子类…不管是谁说的,都是彻头彻尾的愚蠢。请远离这些来源。您可以将_a转换为向量2d&,但这可能是未定义的行为。正确的方法是使用自由函数。也许你可以指定你所说的方便和类型安全是什么意思,因为目前还不清楚你是否需要做任何事情。只需按原样使用vector2D即可。添加非成员函数的功能。doAsOnthoTobe是一个纯C函数,即ExtC?重新解释,以找到父类型可以通过引用或指针来表示参数,但不是由值来表示……从许多来源,我已经收集到了在C++中扭曲这个结构的最安全的方法是对它进行子类…不管是谁说的,都是彻头彻尾的愚蠢。请远离这些来源。您可以将_a转换为向量2d&,但这可能是未定义的行为。正确的方法是使用自由函数。也许你可以指定你所说的方便和类型安全是什么意思,因为目前还不清楚你是否需要做任何事情。只需按原样使用vector2D即可。增加了非成员函数的功能。V2D中没有数据,所以想要做这件事有一定意义。因为C++没有数据结构扩展的概念,所以我的目的是破解继承机制来完成同样的任务。请注意,在这种情况下,子类不是专门化,因为它不添加任何新状态。实例布局与原始C结构相同。子类的唯一目的是添加方便的成员,以便与结构一起使用。@MrMobster只需编写非成员函数,就完成了。@MrMobster不,这本质上是一种误解:只有一个

以下陈述可能是正确的:1。没有额外的状态2。我可以安全地在运行时把这些类型转换成,因为C++可以从VC++中告诉原始的VoCTR2D。V2D中没有数据,所以想要这样做有一定的意义。因为C++没有数据结构扩展的概念,所以我的目的是破解继承机制来实现相同的。请注意,在这种情况下,子类不是专门化,因为它不添加任何新状态。实例布局与原始C结构相同。子类的唯一用途是添加方便的成员,以便与结构一起使用。@MrMobster只需编写非成员函数,就完成了。@MrMobster不,这本身就是一种误解:以下语句中只有一个是真的:1。没有额外的状态2。我可以安全地在运行时把这些类型转换出来,因为C++可以从矢量2D告诉原始向量2D。你的答案肯定是正确的,但是它是对不同问题的回答。我不想从C++代码中调用dothOnthyToes,这确实毫无意义。我希望它是C函数,把C数据类型重新解释为C++类型。@ MrMobster,你想用C++类的实例调用C中的dothAsvanges?为此,您必须更改dothAuthItHype的签名,这样做吗?不,我想用C结构调用C函数,但是在该函数中,将C结构视为具有相同布局的C++结构。@ MRAFSTER,可以在C++中使用C结构。另一方面,你不能。C++类生活在C++领域,如果不清楚做某事会有什么效果,我宁愿说什么也不做。或者除非你得到书面付款。你的答案肯定是正确的,但这是对另一个问题的回答。我不想从C++代码中调用dothOnthyToes,这确实毫无意义。我希望它是C函数,把C数据类型重新解释为C++类型。@ MrMobster,你想用C++类的实例调用C中的dothAsvanges?为此,您必须更改dothAuthItHype的签名,这样做吗?不,我想用C结构调用C函数,但是在该函数中,将C结构视为具有相同布局的C++结构。@ MRAFSTER,可以在C++中使用C结构。另一方面,你不能。C++类生活在C++领域,如果不清楚做某事会有什么效果,我宁愿说什么也不做。或者除非你得到书面的LOC支付。这是未定义的行为。在查看文档一段时间后,我倾向于同意@bolov。这似乎无法以标准兼容的方式完成。很遗憾,但我会活下来的。这是一种未定义的行为。在查阅文档一段时间后,我倾向于同意@bolov。这似乎无法以标准兼容的方式完成。很遗憾,但我会活下来的。