我如何通过一个 TForm(这个)一般?
How do I pass a TForm (this) generically?
>我有两个几乎相同的表单(Form4 和 Form5),它们有几个共同的项目,但处理不同的数据。 我正在尝试编写一个将采用这两种形式之一的辅助函数。
这两种形式都是动态创建的。
到目前为止,我能够编写处理来自 Form4 [Process(TForm4 *F)] 的数据的函数。我无法从 Form5 执行相同的操作,因为帮助程序函数特定于 TForm4。
从表格4
Edit1Exit(Tobject *Sender){
Process(this);
}
从表单5
Edit1Exit(Tobject *Sender){
Process(this);
}
Process(TForm4 *F){
// Do something like F->BitBtn1->Visible=false;
}
问题是Process()是为TForm4编写的,所以它不接受TForm5。
如何声明 Process() 以便它采用任一形式。
一般来说,您将有三个选择:
- 为每个版本编写显式重载,并复制代码。 即,
void Process(TForm4* F) {
/// do things
}
void Process(TForm5* F) {
/// do things
}
- 派生自声明虚拟接口的公共基类,即
class TFormBase {
// common virtual interface, and a virtual destructor
};
class TForm4 : public TFormBase {
// implementation of the interface + data members
};
class TForm5 : public TFormBase {
// implementation of the interface + data members
};
void Process(TFormBase* F) {
// interact with F via the virtual interface
}
- 使用
- 模板(但在这种情况下,函数的实现必须在使用它的地方可访问;通常这意味着它必须位于头文件或可以直接包含的文件中),即
template<typename T>
void Process(T* F) {
// interact with the classes; assumes a common interface
}
为简单起见,我省略了很多细节,但这应该可以帮助您入门。
相关文章:
- 有人能分解一下这个c++模板的语法吗
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么在这个代码结束循环中没有得到结束
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何在BST的这个简单递归实现中消除警告
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 这个指针在c++中的用法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 书中的这个例子不好吗
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 为什么这个音频包络不能通过开关的情况?
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么 gcc 编译这个而 msvc 没有
- 这个函数哪里出错了
- 有人能帮我理解这个c++代码吗
- 有人能帮我处理这个链接列表吗?C++
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 我如何通过一个 TForm(这个)一般?