首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何访问成员变量而不实例化,C++

如何访问成员变量而不实例化,C++
EN

Stack Overflow用户
提问于 2014-03-10 05:13:03
回答 2查看 4.1K关注 0票数 1

假设我有B类,它从另一个A类获得构造函数中的'v‘值。我如何从C类读取这个值?类C将根据需要实例化,但是A已经创建了B并传递了'v‘。“v”在每一个实例化中都会发生变化。我试着在B班做“v”静态的,它能工作吗?我无法正确地执行它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class A {
 public:
 int* v;
 B b1;
 A(int* var) : v(var), b1(var) {};
}

如何从C类访问相同版本的“v”?为了达到目标,我可以定义B和C,但是我喜欢。但我不能为此目的改变A。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-10 10:20:19

您无法访问从未传递给该类的“v”。相反,您可以将其作为A类中的成员进行静态复制。每次A被实例化时,它都会更新如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class A {
 public:
   int* v;
   static int* staticv;
   ...// Constructor etc
}

在A的.cc代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int* A::staticv;
...
A::staticv=this->v;

现在,任何类都可以通过以下方式访问此值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A::staticv;
票数 1
EN

Stack Overflow用户

发布于 2014-03-10 05:18:20

您需要一个(公共)静态成员。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A { //let's stick with your naming convention!
public:
  static int a;
}

A::a = 4;

但是,允许人们更改A::a意味着您的程序可能最终依赖于全局未封装状态.这通常是一个糟糕的设计的标志。

但是,如果您的成员是const,那么您实际上将一个常量与您的类相关联,这并不是很糟糕。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A {
public: 
  static const int a = 4;
}

std::cout << "A:a is always " << A::a << std::endl;

编辑基于更新的问题,如果您需要帮助构建类,我建议您使用某种类型的工厂。如果我理解您的需求,您希望能够向每个A类和B类实例中注入一个值。这个值"v“是基于C类的。

所以..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class C {
private:
  // up to you where you implement the getUniqueNumberForNow function
  // (global free function for example)
  static const int v = getUniqueNumberForNow();
public:
  static A createA(){
    return A(v);
  }
  static B createB(){
    return B(v);
  }
}

getUniqueNumberForNow()函数只获取您应有的值。然后将其存储在class C中,并可在创建A、an\或B期间使用。现在,只需将AB的CTORs设为私有,并使C成为两者的friend,您将只有一种方法来创建AB,并且它将始终使用正确的值。

有关朋友课程的信息,请参阅下面评论中的NeilMonday链接。

最后一件事是,如果您希望对A的每个实例化进行值更改,您可以在工厂中这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  static A createA(){
    return A(getUniqueNumberForNow());
  }

但是,如果这是真正的,那么只需执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A {
public:
  A() : val (getUniqueNumberForNow()), b(B(val)){}
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22301141

复制
相关文章
MySQL 中使用时间戳
创建新记录和修改现有记录都更新方式 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 创建的时候设置时间,后续的修改不再更新 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 创建的时候把字段设置为 0 ,以后修改才更新 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 创建时设置为给定值,以后更新会刷新这个时间 TIMESTAMP DEFAULT 'yyyy-mm-dd hh:mm
zucchiniy
2019/10/30
1.8K0
Spring Boot中使用时序数据库InfluxDB
除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB、LDAP这些存储的案例。接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在Spring Boot中的使用。
程序猿DD
2021/08/05
8940
Spring Boot中使用时序数据库InfluxDB
Excel VBA解读(143): 在自定义函数中使用整列引用时,如何更有效率?
Excel用户经常发现在公式中使用整列的引用很方便,这样可避免每次添加新数据时都必须调整公式。因此,当编写用户自定义函数时,可能会使用:
fanjy
2019/07/19
3K0
在Vue中使用Echarts
前端可视化是一个前端最基本的技能,要想做的好看,还是得借助一下百度家的echarts,那要怎么在Vue中使用echarts?这个官网没有给出实例,实例基本都是在jquery里面使用,引入的例子。
王小婷
2020/11/26
1.3K0
在Grafana中使用Variables
其实在公司内部使用Grafana完全是‘被逼的’。刚开始使用的时候完全是因为懒!也有考虑尽快的输出一些指标而不是走非常漫长的一个前、后、数据端的结伴开发。
CainGao
2020/04/14
12.7K4
在MATLAB中使用opencv
我们来说说第二类,需要做的事情是先编译opencv的源码、再编译matlab可用的mex文件夹,这两步的编译器必须是同一个,而最近几年的新版本matlab都推荐使用MinGW-w64编译器来使用mex、可是mexopencv提供的编译辅助函数在Windows系统上默认使用Visual Studio或者Windows SDK来编译,如果觉得自己需要Visual Studio的其他功能,安装一下也是挺好的
万木逢春
2019/10/09
6.2K0
在MATLAB中使用opencv
在 vuecli 中使用 echarts
可以按需引入的模块列表见 https://github.com/apache/incubator-echarts/blob/master/index.js
4O4
2022/04/25
2420
在 vuecli 中使用 echarts
在vue 中使用Stylus
Stylus => 一个CSS预处理器 安装 cnpm install stylus 初始化项目 vue init webpack filename cd filename cnpm install cnpm install stylus –save-dev cnpm install stylus-loader –save-dev npm run dev 使用 vue中使用Stylus .box background:red .... 引
大象无痕
2018/07/17
6930
在Go中使用Protobuf
本教程使用proto3版本的protocol buffer语言,提供了一个基本的在Go程序中使用protocol buffer的介绍。通过创建一个简单的示例应用程序,向你展示如何
KevinYan
2019/10/13
1.4K0
在Python中使用Elasticsearch
在这篇文章中,我将讨论Elasticsearch以及如何将其整合到不同的Python应用程序中。
小小科
2018/07/31
2.1K0
在Python中使用Elasticsearch
在Sequelize中使用迁移
迁移的好处,可以类比git。通过每次创建迁移文件,来支持更新,回滚数据库表结构,也方便协同开发,也避免人工手动去直接修改数据库,用代码自动管理。换个电脑,也不用去拷贝数据库,直接运行迁移就可以完全恢复开发环境,极大减轻了心智负担。
前端知否
2020/03/23
1.9K0
在ubuntu中使用supervisor
示例如下,在目录/etc/supervisor/conf.d/下创建redsocks2.conf,并加入:
羽翰尘
2019/11/20
6520
在vue中使用swiper
<template> <div class="main"> <!-- .swiper-container --> <div class="wrap"> <img class="bgImg" src="../../../../assets/images/fffbg.png" alt /> <swiper :options="swiperOption" ref="mySwiper"> <swiper-slide v-for="(item,index)
用户4344670
2020/02/13
6770
在Jetty中使用websocket
在工作中,我们有时候需要使用能与前端实时通信传输以通信,这种技术就是由Socket实现的,而Socket又有短连接和长连接之分,长连接技术就是我们今天要介绍的websocket。
Titan框架
2018/09/25
2.3K0
在Jetty中使用websocket
在 Flutter 中使用 WebView
我们知道在开发 Native App 时经常会有打开网页的需求,可供的选择通常只有两种:
出其东门
2019/08/09
3.5K0
在模板中使用函数
系统自带的函数,一般在functions.php中 // C函数,获取配置名称 <title>{:C('WEB_SITE_TITLE')}</title> // U函数,获取URL地址 <a class="brand" href="{:U('index/index')}">OneThink</a>
PM吃瓜
2019/08/12
1.2K0
在模板中使用函数
在Vue中使用Echarts
前端可视化是一个前端最基本的技能,要想做的好看,还是得借助一下百度家的echarts,那要怎么在Vue中使用echarts?这个官网没有给出实例,实例基本都是在jquery里面使用,引入的例子。
王小婷
2020/11/12
8170
在Vue中使用Echarts
在php中使用redis
说这么多就是为了表明,大部分情况下,redis是可以满足我们对于缓存的要求的。下面来说如何在php项目中使用redis作为缓存引擎。
ianzhi
2019/07/31
6460
在yii中使用memcache
说明: 1)class指明所有缓存类, CMemCache即为memcache 2) 当要使用多个cache轮询时,可以给每个cache配权重(weight)。如果只有一个cache,不加这个配置就可以了。
PHP学习网
2022/08/03
3200
点击加载更多

相似问题

openSSL的替代方案

20

Scala:废弃集差的替代方案

13

Environment.getExternalStorageDirectory()废弃替代方案

20

openssl_encrypt的替代方案

10

用于星火DataFrame的废弃DataFrame替代方案

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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