结构内的类

时间:2013-09-21 09:52:59

标签: c++ class structure subclassing

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

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

1 个答案:

答案 0 :(得分:4)

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

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

无法做的事情是AttachToInput()以及派生的类型test以外的公开访问test。您需要声明函数public以便编译此行:

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

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

编辑:值得注意的是,Alan Stokes在撰写此答案时在评论部分提出了同样的建议。 :)

EDIT2 :略有疏忽,对于基类也假定隐式默认访问,具体取决于如何声明派生的类。请参阅What are the differences between struct and class in C++?