【问题标题】:Class within structure结构内的类
【发布时间】:2013-09-21 09:52:58
【问题描述】:

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

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

【问题讨论】:

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

标签: c++ class structure subclassing


【解决方案1】:

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

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

不能做的是从test派生 类型的test 之外公开访问AttachToInput()。您需要声明函数 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++?

【讨论】:

  • 您好 Thokra,感谢您的帮助。它澄清了我的大部分疑惑。我现在已经更新了我的问题。你能看看它并帮助我解决这个问题。美好的一天。
  • @RajuBabannavar:您得到的段错误不是由于对AttachToInput() 的调用。我建议您调试该函数的实现,并确保它没有访问无效地址。使用AttachToInput() 的存根实现,您的示例可以正常工作 - 应该如此。
猜你喜欢
  • 2019-07-09
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2019-08-30
相关资源
最近更新 更多