0

我想在一个结构中定义一个类的对象并访问该类的函数成员。有可能实现这一目标吗?

使用以下代码,我在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);
}
4

1 回答 1

4

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

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

不能做的是AttachToInput()从外部test派生类型的test. 您需要声明该函数public才能编译此行:

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

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

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

EDIT2:轻微的疏忽,根据派生类的声明方式,还假设基类的隐式默认访问。请参阅C++ 中的 struct 和 class 有什么区别?.

于 2013-09-21T10:12:54.653 回答