首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:自定义数据类型-类型转换和联合问题

C++:自定义数据类型-类型转换和联合问题
EN

Stack Overflow用户
提问于 2010-09-28 20:47:17
回答 3查看 2.2K关注 0票数 1

我要做的是创建一个新的自定义数据类型,它的行为与所有其他原始类型一样。具体地说,此数据类型看起来就像一个固定点分数。我已经创建了一个类来表示这种数据类型,称为“FixedPoint类”,其中有一些方法可以将“FixedPoint”类型转换为“整型”、“双精度型”或“无符号整型”等等。

现在,如果我想从"int" to "FixedPoint"中进行强制转换怎么办?最初我的解决方案是有一个构造器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FixedPoint(int i) { /* some conversion from 'int' to 'FixedPoint' in here */ }

此works...but不能放入一个联合中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 union {
   FixedPoint p;
 };

这将中断,因为"FixedPoint“没有隐式的简单构造函数(我们刚刚定义了一个构造函数"FixedPoint(int )”)。

总而言之,整个问题是“我们想要cast from some type T to type FixedPoint without explicitly defining a constructor,这样我们就可以在联合中使用我们的类型FixedPoint”。

我认为解决方案是:定义一个重载的全局类型转换操作符,将"int“转换为"FixedPoint”,但在网上找不到任何证据。

有没有不使用类构造函数就能做到这一点的方法呢?我希望能够在一个联盟中使用这个类。我尝试过的(在全局范围内):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operator (FixedPoint f, int a) { ... } //compiler complains about this is not a method or non-static.

下面是一个小例子来说明联合不喜欢构造函数(他们喜欢POD)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class bob
{
  public:
    bob(int a) { m_num = a; }
  private:
    int m_num;
};
void duck()
{
  union 
  {
    bob a;
  };
}

在Visual Studio中看到的这个错误是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error C2620: member 'duck::<unnamed-tag>::a' of union 'duck::<unnamed-tag>' has user-defined constructor or non-trivial default constructor

有什么想法吗?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-28 21:36:01

我很难明白你想用这个做什么。必须不断地确保sizeof(FixedPoint) == sizeof(int),并且假设还有其他隐藏的陷阱,比如字节顺序,这似乎很难闻。也许我应该在这里后退一点,联合只是将一个值从一种类型“转换”成另一种类型,因为它需要一块内存,并将其引用为不同的类型。即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
union BadConverter
{
    int integer;
    double fraction;
};

BadConverter.fraction = 100.0/33.0;
BadConverter.integer = ?;

我非常确定,整数不会是3,它将是双精度型的内存块,即整数字节与之共享的内存块。

工会似乎不太适合这类事情。我认为只需要从所有原始类型定义一组赋值操作符即可。即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FixedPoint
{
    FixedPoint& operator=(int value);
    FixedPoint& operator=(double value);
    ..etc..
    //Maybe something like this?
    template<typename T>
    FixedPoint& operator=(const T& value)
    {
        value = boost::lexical_cast<int>(value);
        return *this;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2010-09-28 20:57:28

自定义转换运算符必须是要从中转换的类的成员。非平凡的构造函数不是必需的。

编辑:我修改了示例以利用union,因为这就是您所询问的。

EDIT2:如果你正在尝试另一种方式(构造),并且不需要构造函数,请参见下面的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>
#include <sstream>
using namespace std;

class FixedPoint
{
public:
    operator std::string() const
    {
        stringstream ss;
        ss << x_ << ", " << y_;
        return ss.str();
    }
    int x_, y_;
};

union Items
{
    FixedPoint point_;
    int val_;
};

int main()
{
    Items i;
    i.point_.x_ = 42;
    i.point_.y_ = 84;
    string s = i.point_;
}

如果您试图采用另一种方式--例如,在我的示例中,从int转换为FixedPoint --那么通常的方法确实是使用转换构造函数。如果你不想要一个非平凡的构造函数,你必须求助于一个转换函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FixedPoint make_fixed_point(int x, int y)
{
    FixedPoint ret;
    ret.x_ = x;
    ret.y_ = y;
    return ret;
}

union Items
{
    FixedPoint point_;
    int val_;
};


int main()
{
    Items i;
    i.point_ = make_fixed_point(111,222);
}
票数 0
EN

Stack Overflow用户

发布于 2010-09-28 21:07:25

你不能只添加一个默认的构造函数,让它成为联合的一部分吗?

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class bob
{
  public:
    bob(int a=0) { m_num = a; }
  private:
    int m_num;
};
void duck()
{
  union 
  {
    bob a;
  };
}

通过设置a=0的默认值,它应该能够放入一个联合中。不过,我自己并没有试过。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3816912

复制
相关文章
kubernetes 下实现socket.io 的集群模式
socket.io 单节点模式是很容易部署的,但是往往在生产环境一个节点不能满足业务需求,况且还要保证节点挂掉的情况仍能正常提供服务,所以多节点模式就成为了生成环境的一种必须的部署模式。
domain0
2019/05/15
2.5K0
kubernetes 下实现socket.io 的集群模式
清空Redis集群所有节点的数据工具
#!/bin/bash # Batch to clear all nodes using FLUSHALL command # 用来清空一个redis集群中的所有数据,要求 FLUSHALL 命令可用, # 如果在 redis.conf 中使用 rename 改名了 FLUSHALL,则不能执行本脚本。 # 可带两个参数: # 1)参数1 集群中的任一可用节点(必须) # 2)连接redis的密码(设置了密码才需要) REDIS_CLI=${REDIS_CLI:-redis-cli} REDIS_IP=${
一见
2020/09/07
2.1K0
查看Redis集群所有节点内存工具
指定集群中任意一个节点,查看集群中所有节点当前已用物理内存、配置的最大物理内存和系统物理内存。 源码(可从下载):
一见
2018/09/30
2.6K0
Kubernetes 集群部署 RabbitMQ + exporter (单节点)
RabbitMQ 是我们常用的消息的中间件,在项目开发、测试、部署到生成环境时,经常需要部署一套 RabbitMQ 来对数据进应用解耦、异步、流量削锋、数据分发、错峰流控、日志收集等等。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 RabbitMQ 消息中间件,当然,部署的是单节点模式,并非用于生产环境的集群模式。单节点的 RabbitMQ 部署简单,且配置存活探针,能保证快速检测 RabbitMQ 是否可用,当不可用时快速进行重启。
高楼Zee
2021/10/27
1.9K0
Kubernetes 1.8.6 集群部署–Master节点(五)
部署 master 节点 上面的那一堆都是准备工作,下面开始正式部署kubernetes了, 在master节点进行部署。 下载安装文件 # wget https://dl.k8s.io/v1.8.6/kubernetes-server-linux-amd64.tar.gz # tar -xzvf kubernetes-server-linux-amd64.tar.gz # cp -r kubernetes/server/bin/{kube-apiserver,kube-controller-manag
老七Linux
2018/05/31
8370
kubernetes集群搭建(3):master节点安装
1.  192.168.100.6:5000/rhel7/pod-infrastructure:1.0 为私库中的地址,默认配置文件中地址被和谐了,所以可以获取其他镜像源到本地私库
肖哥哥
2018/08/02
8750
使用kubeadm搭建多节点Kubernetes集群
安装kubernetes集群,有很多种方式,比如,minikube,kind,kubeadm,但是相较于kubeadm,前2种方式还是有各种不足之处,鉴于此,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理员”。
南非骆驼说大数据
2022/11/02
2.4K0
Kubernetes 1.8.6 集群部署–Node节点(六)
部署 Node 节点 其它两个node节点,需要在两个节点都执行安装操作 下载文件 # wget https://download.docker.com/linux/static/stable/x86_64/docker-17.12.0-ce.tgz # tar zxvf docker-17.12.0-ce.tar # cp docker/docker* /usr/local/bin 配置启动docker cat > docker.service << EOF [Unit] Description=Do
老七Linux
2018/05/31
9540
Kubernetes 1.8.6 集群部署–Master节点(五)
部署 master 节点 上面的那一堆都是准备工作,下面开始正式部署kubernetes了, 在master节点进行部署。 下载安装文件 # wget https://dl.k8s.io/v1.8.6/kubernetes-server-linux-amd64.tar.gz # tar -xzvf kubernetes-server-linux-amd64.tar.gz # cp -r kubernetes/server/bin/{kube-apiserver,kube-controller-manag
老七Linux
2018/05/15
1.5K7
Kubernetes 1.8.6 集群部署–Master节点(五)
kubernetes集群搭建(4):node节点安装
注意: /atomic.io/network 需与  master配置第7步中配置 etcdctl mk /atomic.io/network/config '{"Network":"172.16.0.0/16"}' 名称一致
肖哥哥
2018/08/02
5050
Kubernetes集群添加运行containerd runtime的 work节点
kuberadm搭建的1.15的初始集群,参见:2020-07-22-腾讯云-slb-kubeadm高可用集群搭建
对你无可奈何
2021/06/29
1.1K0
多个 Kubernetes 集群同GitLab Core功能的集成
本文将描述,在使用带有Core许可的GitLab中,它是如何将 Kubernetes 集群集成到GitLab CI/CD的进程里。在下面的例子中,我们会使用这个方法来集成Kubernetes。先来看看GitLab的官方支持文档以及我们自己的解决方案。
DevOps时代
2020/12/15
1.6K0
多个 Kubernetes 集群同GitLab Core功能的集成
Kubernetes高可用集群二进制部署(六)Kubernetes集群节点添加
必须配置native.cgroupdriver,不配置这个步骤会导致kubelet启动失败
鱼找水需要时间
2023/08/03
3570
Kubernetes高可用集群二进制部署(六)Kubernetes集群节点添加
巧用 Prometheus 监控 Kubernetes 集群所有组件的证书
有部分读者可能听说过 ssl-exporter[2] 这个项目,它能提供多种针对 SSL 的检测手段,包括:HTTPS 证书、文件证书、Kubernetes Secret、Kubeconfig 文件。从功能上来看,它基本可以满足上述需求,但它的指标还不够丰富,本文将介绍一个更为强大的 Prometheus Exporter:x509-certificate-exporter[3]。
米开朗基杨
2021/07/15
1.6K0
Kubernetes 集群部署 MongoDB+exporter (单节点)
MongoDB 是我们常用的 NoSQL 数据库,在项目开发、测试、部署到生成环境时,经常需要部署一套 MongoDB 来对文档数据进行存储。这里介绍下如何在 Kubernetes 环境中部署用于开发、测试的环境的 MongoDB 数据库,当然,部署的是单节点模式,并非用于生产环境的主从或集群模式。单节点的 MongoDB 部署简单,且配置存活探针,能保证快速检测 MongoDB 是否可用,当不可用时快速进行重启。
高楼Zee
2021/10/27
1.9K0
(译)Zalando 是如何管理 140 多个 Kubernetes 集群的
最近我接到一个问题:“你是如何管理这么多 Kubernetes 的?”。本文试图揭示 Zalando 在 AWS 管理 140 多个 Kubernetes 集群的秘密。
崔秀龙
2019/11/05
1.1K0
(译)Zalando 是如何管理 140 多个 Kubernetes 集群的
kubeadm搭建kubernetes集群之三:加入node节点
该文介绍了如何使用kubeadm部署kubernetes集群,包括Master和Worker节点。首先介绍了kubeadm的作用,然后描述了如何利用kubeadm部署Master节点。接着介绍了如何配置kubectl以通过Master节点来管理集群。最后,介绍了如何添加Worker节点以扩展集群。
程序员欣宸
2018/01/04
3.2K1
kubeadm搭建kubernetes集群之三:加入node节点
零停机给Kubernetes集群节点打系统补丁
Salesforce 的 Einstein Vision 和语言服务部署在 AWS Elastic Kubernetes Service(EKS) 集群上。其中有一个最主要的安全和合规性需求,就是给集群节点的操作系统打补丁。部署服务的集群节点需要通过打补丁的方式进行系统的定期更新。这些补丁减少了可能让虚拟机暴露于攻击之下的漏洞。
深度学习与Python
2021/06/08
1.2K0
零停机给Kubernetes集群节点打系统补丁
kubeadm搭建kubernetes集群之二:创建master节点
程序员欣宸
2018/01/04
1.6K0
kubeadm搭建kubernetes集群之二:创建master节点
点击加载更多

相似问题

高图表列范围重叠列

17

高图-列范围为箭头

12

如何在高图表列范围图的不同列中显示重叠

17

高图表列图分组

10

高图表列图-呈现后手动转换列

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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