2013-09-21 34 views
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); 
} 
+1

您遇到过什么问题? –

+7

您不能调用'AttachToInput',因为它是受保护的,所以只有派生类可以使用它。 (它的工作方式与Java中的不同。)这是你的问题吗? –

+0

“我有一个独特的”!? –

回答

4

首先,一个class并在C struct ++之间唯一的区别是,一个类的成员private默认和结构的成员默认为public。编译器生成的计数器和计数器在两种情况下均可见 - 除非程序员另有说明(例如,它们将默认计数器移动到private部分中)。否则,在没有明确的公共声明的情况下,构建和销毁标记为class的用户定义类型的实例是不可能的 - 因此无法实现编译器生成函数的目的。

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

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

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

在其它不相关的说明(但我碰到它,所以我提到它),你class test持有原始指针char。如果被指向的实体的生存期保证超过持有该指针的对象的生存期,则保持原始指针是可以的。否则,该对象本身很可能负责销毁该实体。你需要确定谁拥有什么以及谁负责分配和重新分配东西。

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

EDIT2:轻微的监督,隐含的默认权限也会承担这取决于如何派生类被声明为基类。请参阅What are the differences between struct and class in C++?

+0

Hello Thokra, 感谢您的帮助。它澄清了我的大部分疑问。我已经更新了我的问题。你可以看看它并帮我解决这个问题。美好的一天。 – Raju

+0

@RajuBabannavar:你得到的段错误不是由于对'AttachToInput()'的调用。我建议你调试该函数的实现并确保它不访问无效地址。使用'AttachToInput()'的存根实现,您的示例可以正常工作 - 因为它应该。 – thokra