我一直在读C中的OOP,但我从来不喜欢你不能在C++中拥有像你这样的私人数据成员.但后来我想到你可以创建2个结构.一个在头文件中定义,另一个在源文件中定义.
// =========================================
// in somestruct.h
typedef struct {
int _public_member;
} SomeStruct;
// =========================================
// in somestruct.c
#include "somestruct.h"
typedef struct {
int _public_member;
int _private_member;
} SomeStructSource;
SomeStruct *SomeStruct_Create()
{
SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource));
p->_private_member = 42;
return (SomeStruct *)p;
}
Run Code Online (Sandbox Code Playgroud)
从这里你可以将一个结构投射到另一个结构.这被认为是不好的做法吗?还是经常这样做?
在问题中我们为什么要在C中经常输入一个结构?,放松回答:
在后一种情况下,您不能返回Point by值,因为它的声明对头文件的用户是隐藏的.例如,这是GTK +中广泛使用的技术.
如何完成声明隐藏?为什么我不能按值返回Point?
加:
我理解为什么我不能通过值返回结构,但是,仍然很难理解为什么我不能在我的函数中尊重这一点.即如果我的结构有名为y的成员,为什么我不能这样做?
pointer_to_struct->y = some_value; Run Code Online (Sandbox Code Playgroud)
我为什么要使用方法呢?(像Gtk +)
谢谢你们,再次为我糟糕的英语道歉.
给定一个C++源代码,我想找到每个函数写入和读取的类字段.使用Clang前端的最佳方法是什么?
(我不是要求对所有步骤进行详细解释;但是,有效解决方案的出发点会很棒.)
到目前为止,我尝试使用RecursiveASTVisitor解析语句,但是跟踪节点连接很困难.另外,我无法弄清楚如何跟踪下面的内容:
int& x = m_int_field;
x++;
Run Code Online (Sandbox Code Playgroud)
这明显改变了m_int_field; 但Stmt只要一个人就不可能知道; 所以AST遍历本身似乎不够.
对我来说,一个好处就是可以单独计算字段和子字段(例如,访问成员结构的三个字段).
例:
typedef struct Y {
int m_structfield1;
float m_structfield2;
Y () {
m_structfield1 = 0;
m_structfield2 = 1.0f;
}
} Y;
class X {
int m_field1;
std::string m_field2;
Y m_field3;
public:
X () : m_field2("lel") {}
virtual ~X() {}
void func1 (std::string s) {
m_field1 += 2;
m_field2 = s;
}
int func2 () {
return m_field1 + 5;
}
void func3 (Y& y) …Run Code Online (Sandbox Code Playgroud)