我想在结构中定义类的对象并访问类的函数成员。是否有可能实现这一目标?
使用以下代码,我在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);
}
答案 0 :(得分:4)
首先,C ++中class
和struct
之间的唯一区别是默认情况下类的成员为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++?。