Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C中结构多态性的最佳方法

C中结构多态性的最佳方法
EN

Stack Overflow用户
提问于 2013-08-24 10:54:51
回答 3查看 8.2K关注 0票数 13

我正在编写一个简单的二维向量对象。它将有x和y分量,长度,交叉积等方法。问题是,我希望结构有许多可能的类型(char、int、float、double等等)。我想知道什么是最好的选择,设计明智,与对象互动?我现在正在考虑的是:

1.让用户将向量对象传递给专用函数,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vector2Dt_Dot(Vec2Dt* vector1, Vec2Dt* vector2);

其中t是向量的类型。然而,这种方法的问题在于它不允许不同类型的交互,所以我不能说计算浮点vector2d和双vector2d的点积。第二种方法,我倾向的是:

2.让用户将向量对象作为空指针传递,以及它们的类型,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vector2D_Dot(void* vector1, unsigned vector1_type, void* vector2, unsigned vector2_type);

显然,这种方法更加紧凑的API,也解决了上述问题,但代价是一些额外的参数和类型的安全性。

也许还有其他我不知道的解决方案,但是这些是我目前正在考虑的解决方案。你觉得最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-24 11:20:19

您可以做的是使用多态对象。定义如下结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define INT_TYPE 0
#define DOUBLE_TYPE 1
//more type constants

typedef struct Vector2D {
    int type;
} Vector2D;

typedef struct Vector2D_int {
    Vector2D super;
    int x, y;
} Vector2D_int;

typedef struct Vector2D_double {
    Vector2D super;
    double x, y;
} Vector2D_double;

//more typed vector structures

然后,您可以编写函数来接受Vector2D指针,检查它们各自的类型字段,并将它们转换为适当的类型化变量来访问有效负载数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double Vector2D_length(const Vector2D* vector) {
    if(vector->type == TYPE_INT) {
        const Vector2D_int* intVector = (Vector2D_int*)vector;
        return sqrt(intVector->x * intVector->x + intVector->y * intVector->y);
    }
    if(vector->type == TYPE_DOUBLE) {
        const Vector2D_double* doubleVector = (Vector2D_double*)vector;
        return sqrt(doubleVector->x * doubleVector->x + doubleVector->y * doubleVector->y);
    }
    //other cases follow
}

这是手工编码的多态性。您需要确保的是,type字段始终设置为正确的值(在创建类型化向量时设置一次)。

这种方法对你的第二个想法的好处是,你不必在另一个变量中传递向量的类型,这会使你的向量的使用变得繁琐和容易出错。

作为另一种选择,您可以定义type字段以包含指向函数指针结构的指针。您将为您定义的每个类型的vector创建一个函数指针结构的对象,并使用它查找与给定向量一起使用的函数。这种方法非常接近于C++在幕后所做的工作。

票数 19
EN

Stack Overflow用户

发布于 2013-08-24 11:06:01

您可以使用变量参数列表,它的原型被编码,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int  xyz(int a, ...);

这种样式需要一个已定义的参数(在本例中为a ),然后是可以在运行时确定数据类型的任意数量的参数。

有关如何处理变量参数列表的完整说明,请参阅函数和对象:va_listva_startva_argsva_end

希望这能有所帮助。如果有关于va_list等的问题,请问。

票数 2
EN

Stack Overflow用户

发布于 2013-08-25 09:20:21

实际上,我所做的是:

我创建了一个基类Vector2D,其布局如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Vector2D_Base;
typedef struct Vector2D_Base{
    M_double (*Vector2D_Get_X)(struct Vector2D_Base* vec);
    M_double (*Vector2D_Get_Y)(struct Vector2D_Base* vec);
} Vector2D;

正如您所看到的,这允许泛型向量函数调用这些函数,以便将派生类的x和y值转换为双值,从而防止泛型函数不得不担心char和float等类型的大小之间的差异。然后每个派生类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define DEFINE_VECTOR2D(type, name)\
typedef struct{\
Vector2D_Base vec_base;\
type x, y;\
} Vector2D##name\
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18422002

复制
相关文章
构造函数隐式转换_构造函数实例化对象
http://blog.csdn.net/thefutureisour/article/details/7705771
全栈程序员站长
2022/11/10
4040
构造函数的选择:直接实例化 vs 明确构造
在编程领域,创建对象是最基本也是最常见的操作之一。然而,在创建单个类型的对象时,我们是否应该使用构造函数,还是可以直接创建对象,这是一个值得讨论的问题。在本文中,我们将探讨这两种方法的优缺点,并尝试为开发者提供一些实用的建议。
运维开发王义杰
2023/10/10
1680
构造函数的选择:直接实例化 vs 明确构造
Kotlin构造函数与实例化
Kotlin作为面向对象的编程语言,也支持为类型声明构造函数。不过Kotlin声明构造函数的方式相比Java有所变化,下面这个示例演示了在Kotlin中声明构造函数的方式。
博文视点Broadview
2020/06/11
2.4K0
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;
韩曙亮
2023/03/27
4.2K0
构造函数没有返回值是怎么赋值的?
众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?
帅地
2020/09/28
1.7K0
构造函数没有返回值是怎么赋值的?
构造函数没有返回值是怎么赋值的?
众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?
好好学java
2020/12/09
1.7K0
构造函数没有返回值是怎么赋值的?
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.5K0
JavaScript手写new实现构造函数实例化
😇 思路 在调用new操作符的时候会发生以下四件事 首先创建一个空对象 设置原型,将对象的__proto__纸箱构造函数的protype对象 让函数的this指向这个对象,执行构造函数的代码(为这个新对象添加属性) 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用型对象,则返回这个引用类型的对象 😎 代码实现 function objectFactory(){ let object=null; //shift() 方法移除数组的第一项,并返回该值 //在这里是获得接收到的第一个参数 l
henu_Newxc03
2022/05/05
4450
Java构造函数没有返回值,是怎么赋值的?
众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?
程序员小猿
2021/01/20
2.1K0
Java构造函数没有返回值,是怎么赋值的?
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数
Java里的构造函数(构造方法)
本文转载之https://www.cnblogs.com/livterjava/p/4709561.html
用户7886150
2021/01/31
2.5K0
创造特殊的构造函数——寄生构造函数模式
当我们需要构造一个特殊的数据,我们可以通过寄生构造函数来实现。比如我们要格式化一个Array(简单举例),将其变成一个有“|”组成的字符串,我们可以这么做:
就只是小茗
2018/12/07
9590
一个以前没有注意的问题:java构造函数的执行顺序
昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺序整理出来. 首先是我测试的代码:
哲洛不闹
2018/09/19
1K0
一个以前没有注意的问题:java构造函数的执行顺序
一个以前没有注意的问题:java构造函数的执行顺序
昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺序整理出来. 首先是我测试的代码:
哲洛不闹
2018/09/19
6930
一个以前没有注意的问题:java构造函数的执行顺序
【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )
如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作 ;
韩曙亮
2023/10/15
1.3K0
【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.5K0
JavaScript的构造函数
在Java语言中,我们使用构造函数是实例化对象的过程,在JavaScript语言中我们可以使用构造函数的方式创建对象,如:
伯爵
2019/10/09
1K0
JavaScript的构造函数
js的构造函数
//构造函数 //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法 //当对象被实例化后,构造函数会立即执行它所包含的任何代码 function myObject(msg){ //特权属性(公有属性) this.myMsg = msg; //只在被实例化后的实例中可调用 this.address = '上海'; //私有属性 var name = '豪情'; var age = 29; var that = this; //私有方法 function
山河木马
2019/03/05
2.7K0
js的构造函数
一个以前没有注意的问题:java构造函数的执行顺序
昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺序整理出来. 首先是我测试的代码:
哲洛不闹
2018/09/14
9590
一个以前没有注意的问题:java构造函数的执行顺序
点击加载更多

相似问题

如何使触屏启动/触屏事件禁用按钮?

20

jQuery和jQuery移动:点击与触屏、触屏、触屏和点击?

24

ipad上的动态JS触屏/触屏混淆

14

触屏悬停

11

检测触屏/触屏是否取消了滚动(动量滚动)

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文