如何将结构移动到类中?

时间:2010-03-28 22:22:58

标签: c++ class struct

我有类似的东西:

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_;

2 个答案:

答案 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;
  };
  ...
}