我有类似的东西:
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而不创建新类?数据镜像我正在其他地方使用的库中存在的结构。 (即相同的字段,只是不同的名称。我稍后将数据转换为其他结构。我这样做是因为Foo是一个抽象类,使用该库的派生类只是其中之一。)
目前,只是在课堂上粘贴它并将Data
替换为Foo::Data
无处不在。
class Foo {
typedef struct Data_s {
int field1;
int field2;
} Data;
...
}
我在'Data' in class 'Foo' does not name a type
Bar data_;
答案 0 :(得分: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 :(得分:2)
更确切地说,在您提供的代码段中无法访问Foo :: Data。类成员默认为私有可见性。
其次,当您使用C ++时,不建议使用typedef进行结构声明(还有其他有效用途,但您的用法不是这样)。
请尝试使用此更正版本:
class Foo {
public:
struct Data {
int field1;
int field2;
};
...
}