c++ - C ++ / C项目中的Getter和Setter?
问题描述
我正在尝试更新 C/C++ 代码,想要使用 getter 和 setter 进行跟踪和/或测试。
为一般声明制作了一个模板类
#include <iostream>
using namespace std;
#define TRACK_PROP(a,b) TrackProp<a> b(#b);
#define TRACK_PROP_SET(a,b,c) TrackProp<a> b(#b, c);
template <class T>
class TrackProp {
public:
T _content;
const char* Name;
TrackProp(const char* name) { Name = name; }
TrackProp(const char* name, T val) { Name = name; _content = val; }
T operator =(T right)
{
if (_content != right) {
cout << Name << ":" << _content << "->" << right << endl;
_content = right;
}
return _content;
}
operator T() const
{
return _content;
}
T operator ++()
{
operator = (_content + 1);
return _content;
}
T operator ++(int)
{
operator = (_content + 1);
return _content - 1;
}
T operator --()
{
operator = (_content - 1);
return _content;
}
T operator --(int)
{
operator = (_content - 1);
return _content + 1;
}
T operator +=(int right)
{
operator = (_content + right);
return _content;
}
T operator -=(int right)
{
operator = (_content - right);
return _content;
}
};
我现在可以轻松翻译声明
int foo;
int bar = 2;
// These 2 or even some object can be declared by
TRACK_PROP(int, foo);
TRACK_PROP_SET(int, bar, 2);
foo = 1; // = operator /setter
int baz;
baz = bar; // () operator /getter
但是在 C 文件中使用它们时也会出现问题。
您将如何更改它以保留 Get/Set/Name 功能并能够像在 C++ 中一样简单地在 C 文件中使用它?
解决方案
C 没有运算符重载,并且 C 运算符不是有效的宏名称,因此无法自动将任何 C 操作转换为函数调用。您当然可以实现 getter 和 setter(作为顶级函数,因为 C 也没有方法/成员函数),但它们需要显式声明和显式调用。
据我了解,您要实现的目标是,它在 C 中根本不起作用。您需要手动检测您的 C 源代码以获得与您的模板在该方面为您提供的类似的东西。
附录
在同一个项目中同时拥有 C 和 C++ 代码的重要性似乎有些混淆。特别是,似乎有一种观念认为它具有重要意义。它没有,至少没有一个适用于这个问题。
C 源文件由 C 编译器编译,并定义了这些翻译单元可用的语言特性。C++ 源代码由 C++ 编译器编译,并定义了这些翻译单元中可用的语言特性。一侧的函数可以调用另一侧的函数,但有一些注意事项,但这并不取决于是否属于同一个项目。让您的自动 getter/setter 技巧应用于 C 代码是不够的。
推荐阅读
- javascript - 反应路由中的错误 404
- android - Android 异常:cursor.getString(cursor....ColumnIndex("bucket_id")) 不能为空
- apache-spark - 触发多个 CSV 读取?
- node.js - Loggly 子域是必需的
- python - 使用 keras 进行视觉问答的损失不收敛
- jquery - jQuery toggleClass 仅在单击的 div 之外的一个 div 上,并非都具有相同的类
- javascript - 如何将firebase auth/wrong-password显示为窗口警报?
- node.js - 运行量角器测试时出现 NPM 错误(EPERM:不允许操作)
- docker - docker中的Spark,为驱动程序/执行程序设置内存
- unit-testing - 使用 PowerMockito 调用计算次数私有方法