我有类似的东西:

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中?数据反射(reflect)了我在其他地方使用的库中现有的结构。 (即,相同的字段,只是名称不同。我稍后将数据转换为其他结构。之所以这样做,是因为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_;

最佳答案

您可以在类中定义该结构,但需要在首次使用它之前进行。与类本身一样,结构必须进行前向声明才能使用它们:

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

07-24 09:46
查看更多