2010-03-28 30 views
3

我有一样的东西:如何将结构移动到类中?

typedef struct Data_s { 
    int field1; 
    int field2; 
} Data; 

class Foo { 
    void getData(Data& data); 
    void useData(Data& data); 
} 

在另一个类的功能,我可以做:

class Bar { 
    Data data_; 
    void Bar::taskA() { 
    Foo.getData(data_); 
    Foo.useData(data_); 
    } 
} 

是否有移动数据排除在全球范围内,进入富而不创建方式一个新班级?数据镜像我在别处使用的库中存在的结构。 (即相同的字段,只是名称不同,后来我将数据转换为另一个结构体,我这样做是因为Foo是一个抽象类,并且使用该库的派生类只是其中的一个)。

当前,只是粘贴它里面的类和DataFoo::Data无处不在工作。

class Foo { 
    typedef struct Data_s { 
    int field1; 
    int field2; 
    } Data; 
    ... 
} 

我得到'Data' in class 'Foo' does not name a typeBar data_;

+0

所以,你想创建一个类,它类似于Data_s?或者你想在运行时将其成员的值复制到一个类中? – Cam 2010-03-28 22:25:32

+1

struct和class只有几个区别,你想通过'将struct移动到class'来实现什么?可能要澄清一下你究竟想要做什么会有所帮助。 – stefanB 2010-03-28 22:29:08

+0

增加/澄清。那个更好吗? – Kache 2010-03-28 22:55:13

回答

4

可以定义在类中的结构,但你需要提前的地方做它,你第一次使用它。结构,像类本身,必须以使用它们前置声明:

class Foo 
{ 
public: 
    struct Data 
    { 
     int field1; 
     int field2; 
    }; 

    void getData(Foo::Data& data) {} 
    void useData(Foo::Data& data) {} 
}; 

void UseFooData() 
{ 
    Foo::Data bar; 
    Foo f; 
    f.getData(bar); 
    f.useData(bar); 
} 

编辑:更新例如使用相同的字段/类名,如在原来的问题列出。请注意,为了在类别Foo之外可见,需要将Data声明为public,其他代码需要将其引用为Foo::Data

+1

由于问题的结构Data_s和类Foo,你可以修改你的答案呢? – 2010-03-28 22:30:10

2

更准确地说,Foo :: Data不能在您提供的代码片段中访问。班级成员默认为私人可见度。其次,当你使用C++时,不推荐typedef用于结构声明(还有其他有效的用途,但你的用法不是)。

试试这个修改后的版本,而不是:

class Foo { 
public: 
    struct Data { 
    int field1; 
    int field2; 
    }; 
    ... 
} 
+0

只是好奇,什么时候推荐结构声明的typedef呢? – Kache 2010-03-28 23:37:20

+0

永远不会在C++中。在C中,如果你没有使用typedef,你必须在每个地方说“struct that”,typedef让你说“那个”。用C++你不需要结构,所以typedef是无用的。 Typedef还有其他用途,特别是在存在模板的情况下,但对类或结构体定义的typedef是一种快速发现C++程序员零C++经验的方法。 – 2010-03-29 00:20:10

+0

实际上,我只是在做b/c,我是用minizip和unrar库的例子,它们用C @@ @ – Kache 2010-03-29 04:05:48

相关问题