结构中的类

Class within structure

本文关键字:结构      更新时间:2023-10-16

我想在结构中定义类的对象并访问该类的函数成员。有可能做到这一点吗?

使用以下代码,我在ps_test->AttachToInput(2145);处遇到分段错误。我无法弄清楚原因,一切对我来说都是正确的:

class test
{
public:
    test();
    virtual ~test();
    int init_app(int argc, char* argv[]);   
    virtual void AttachToInput(int TypeNumber, int DeviceNo=0);
}
struct capture
{
    test h_app;
    gint port;
};
main()
{
    struct capture h_cap;
    test *ps_test = &h_cap.h_app;
    ps_test->AttachToInput(2145);
}

首先,C++中classstruct之间的唯一区别是,默认情况下private类的成员,默认情况下public结构的成员。编译器生成的 ctor 和 dtor 在这两种情况下都是可见的 - 除非程序员另有说明(例如,他们将默认 ctor 移动到private部分中)。否则,如果没有显式的公共声明,就不可能构造和销毁标记为 class 的用户定义类型的实例 - 从而违背编译器生成函数的真正目的。

所以基本上,你在示例中所做的只是两个用户定义类型的组合,这是完全合法的。创建 capture 的实例时,也会创建 test 的实例。

不能做的是从test派生类型的test之外公开访问AttachToInput()。您需要声明函数public才能编译此行:

h_cap.h_app.AttachToInput(); // error: member function of `test` is protected

在另一个不相关的笔记上(但我遇到了它,所以我提到了它),你的class test有一个指向char的原始指针。如果保证所指向的实体的生存期超过持有指针的对象的生存期,则可以保留原始指针。否则,对象本身很可能负责所述实体的破坏。你需要确定谁拥有什么,谁负责东西的分配和分配。

编辑:应该指出的是,艾伦斯托克斯在我写这个答案时在评论部分提出了同样的建议。 :)

EDIT2:轻微的疏忽,根据派生类的声明方式,也假定基类具有隐式默认访问权限。请参阅C++中的结构体和类之间有什么区别?。