- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用来自不同类的类成员,将“class uart”添加到“class parser : public uart”
但是我不能在解析器类中使用成员变量,例如(bufer_size、buffer 或 state Enum,值不会改变或更新)我可以使用这些变量的唯一方法是将它们用作外部变量,但我会喜欢以类(class)成员的方式去做。
下面请找到我的代码:
主要内容:
#include <stdio.h>
#include "parser.h"
int main()
{
parser m_parser;
m_parser.test();
return 0;
}
uart.h
#include <stdint.h>
#include <stdio.h>
//extern uint16_t buffer_size;
//extern char buffer[1024];
class uart
{
public:
// Construction
uart();
//..... some functions
void Initialize();
//members
enum STATE_enum
{
Buffering_message=0,
Message_received,
Buffering_empty
};
STATE_enum state;
uint16_t buffer_size;
char buffer[1024];
protected:
// static void UARTHandler(app_uart_evt_t * p_event);
void Message();
// Singleton instance
static uart * m_instance;
};
uart.cpp
#include "uart.h"
//uint16_t buffer_size=0;
//char buffer[1024];
uart * uart::m_instance = 0; // Singleton instance
uart::uart()// Construction
{
state = Buffering_empty;
m_instance = this;
}
void uart::Initialize()
{
}
/*void UART::UARTHandler(app_uart_evt_t * p_event)
{
Message();
}*/
void uart::Message()
{
uint8_t value;
// while ((app_uart_get(&value)) == NRF_SUCCESS) //specific function from my microcontroller stack for reading RX bytes
{
if(value == 0x0A ) // message end /r
state = Message_received;
}
switch (state)
{
case Message_received:
printf("message:[%s] buffer_size:[%d]", buffer,buffer_size); //printf fine from there
break;
case Buffering_message:
buffer[buffer_size++] = value;
break;
default:
break;
}
}
解析器.h
#include <stdio.h>
#include <stdint.h>
#include "uart.h"
class parser : public uart
{
public:
parser();
void test();
static parser * m_instance;
static inline parser & Instance()// Singleton access
{
return *m_instance;
}
};
解析器.cpp
#include "parser.h"
class parser * parser::m_instance = 0;
// Constructor
parser::parser()
{
m_instance = this;
}
void parser::test()
{
printf("state %s", state); // sending AT command
// memset(buffer, 0, buffer_size);
// buffer_size = 0;
}
我应该将上面的用作公共(public)类还是将其添加为友元类,或者只是用作外部变量?
最佳答案
最初的问题显然是使用了错误的格式说明符:
void parser::test()
{
printf("state %s", state);
// ^^
}
%s
仅适用于 C 字符串(即以 null 结尾的 char
数组)。在这里,state
被解释为一个指针,但它指向无效地址(未定义的行为),因此您的应用程序可能在它能够产生任何输出之前就崩溃了。
即使 state
did 包含有效地址,您仍然会遇到未定义的行为,因为 %s
需要 类型的参数>char*
(为了避免UB,需要强制转换)。
使用正确的格式说明符来解决问题:
printf("state %u", static_cast<unsigned int>(state));
您仍然需要转换以避免 UB,因为 %u
需要 unsigned int
,但您的枚举不是(或者您可以使用 %d
并转换为 int
)。
显然,您现在也尝试(因为没有发现真正的错误)通过使用单例来绕过您假设它是什么——不幸的是,由于错误地实现了模式,您你的设计有缺陷。
如何修复?首先,放弃单例。在给定的情况下绝对没有必要。然后三思(下面的问题之前):解析器真的是一个 UART 吗?不考虑代码,而是考虑概念,我明确地说“不”。所以你也不应该让 inherit parser
来自 uart
。而是让它聚合一个:
class parser // : public uart
{
uart m_uart;
public:
// ...
void test()
{
printf("%u", static_cast<unsigned int>(m_uart.state);
}
};
或者,您可以通过指针或引用(对构造函数)在外部提供它并按原样存储它,但随后您也会很快遇到生命周期管理,我建议您返回更高级的概念有了更多的经验......
不过,您应该习惯的是:封装。不要公开成员变量,除非您真的希望它们在任何地方 都可以更改。例如,buffer
是私有(private)(甚至未 protected )的热门候选对象。
最后是buffer_size
:如果您打算用它来计算缓冲区中当前 值的数量,那么它很好。如果它表示可以 存储的最大数据数,那么它就是冗余的。在任何需要它的地方,您都可以通过 sizeof(buffer)/sizeof(*buffer)
获取大小(除非数组已衰减为指针!)。按第一个元素的大小划分是必要的,因为 sizeof
始终以字节为单位提供大小,而不是以元素数量为单位。
元素数量的大小是您通过 std::array::size
获得的;你应该更喜欢std::array由于出色的界面,优于原始数组!也许std::vector even 是更好的选择吗?
关于c++ - 如何在另一个类(class)中使用类(class)成员的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081958/
test = (function(){var key = 200; return {getKey : function(){return key} }; })(); test.
如果这个问题可能一直被问到,我很抱歉,但我进行了搜索,但找不到足够的答案。 如果公共(public)成员/方法正在访问私有(private)成员/字段,如何禁用它们的继承? 所以考虑一下: publi
重要的澄清:一些评论者似乎认为我是从 union 复制的。仔细查看 memcpy,它从一个普通的旧 uint32_t 地址复制而来,该地址不包含在 union 中。另外,我正在(通过 memcpy)复
spinner 通常只显示一个字符串,在我想分配 IDpersonne 和 Name 的情况下,旋转器必须告诉我名字。当我得到选定的项目时,我必须得到 ID。我该怎么做? 最佳答案 我假设您已将项目排
A 类的实例是 B 类的公共(public)成员。B 类的实例也是 A 的公共(public)成员。在什么情况下可能需要这种实现?我的意思是是否有一个或多个标准场景需要这种实现方式?更具体的细节:我有
我如何设置我的 web.config 以使用表单例份验证,将成员身份提供程序设置为 ActiveDirectoryMembershipProvider 并使用内置登录控件。这样我就可以使用有效的事件目
这个问题已经有答案了: Should methods in a Java interface be declared with or without a public access modifier?
因此根据定义,类中的私有(private)数字在序列化时以类名作为前缀。这对我来说是一个问题,我希望能够序列化/保存/反序列化一个确切的对象,但是 php 所做的是给我另一个 classname+va
我实现了一个成员? clojure 中的函数如下: (defn member? [item seq] (cond (empty? seq) false (= item (first
我在这里的问题似乎总是与使用函数有关。它仍然让我困惑!在本教科书练习中,我被要求按值传递结构,然后调整它并按引用传递。最初我设计的代码是在 main 中完成所有工作。现在我正在传递值。所以我添加了新函
所以我有这些变量 List files, images = new List(); string rootStr; 还有这个线程函数 private static int[] thread_searc
我对 C++ 模板和尝试弄清楚部分模板特化还比较陌生。我正在使用模板实现几个相关的数据结构:用于概率存在/不存在查询的布隆过滤器(基于位数组),以及用于丰度查询的计数布隆过滤器(带有整数数组)。我从以
例如在 java 中,我在外部类和内部类中声明并初始化了一个 JButton,我决定在某些情况下将其隐藏,这是一种安全的编程实践吗? 最佳答案 内部类的全部目的是它们可以访问到环绕内部类的外部类。 所
我有一个使用库进行通信的类: class Topic { Topic( Type T, String name ); }; class Reader { Reader (Topic, Stri
我在两个单独的文件中有以下代码。 package animal; public class Frog { protected void ribbit() { Syste
我有一个分数列表。使用这些,我需要从 redis 排序集中提取值。 我知道我可以使用 zrangebyscore - 但如果我提供的列表中的分数不连续怎么办?在这种情况下,我不能依赖 zrangeby
过去几年我一直被 C# 编码宠坏了,现在我又回到了 C++ 并发现我在处理本应很简单的东西时遇到了麻烦。我正在为 gamedev 使用名为 DarkGDK 的第三方库(任何以 db 为前缀的命令),但
我正在关注 Brian Harvey 从 2011 年开始在 UC Berkeley site 上的 SICP 讲座。 .他正在使用 STk interpreter教这门课,我正在使用带有 DrRac
在这段代码中,为什么在运算符重载中无法访问我的类的私有(private)字段? (请注意,这只是一个 MRE,不是完整代码) template class Frac template Frac o
在命名命名空间类中,我将一个类(位于全局命名空间中)声明为友元。 但是,后一个类不能访问前一个类的私有(private)成员。为什么是这样?有什么办法可以解决吗? Bob.h namespace AB
我是一名优秀的程序员,十分优秀!