如何将一个结构体移到一个类中?

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

有没有一种方法可以将 Data 从全局作用域移动到 Foo 中,而不创建一个新的类?Data 是一个库中已存在的结构体的镜像。(即相同的字段,只是名称不同。稍后我会将 Data 强制转换为另一个结构体。我这样做是因为 Foo 是一个抽象类,使用库的派生类只是其中之一。)
当前,在类中粘贴它并在所有地方用 Foo::Data 替换 Data 并不能起作用。
class Foo {
  typedef struct Data_s {
    int field1;
    int field2;
  } Data;
  ...
}

我在 Bar data_; 处收到了 'Foo' 类中的 'Data' 不是一种类型 的错误提示。


你想创建一个类,它类似于Data_s吗?或者你想在运行时将其成员的值复制到一个类中? - Cam
1
结构体和类之间只有一些细微的差别,你想通过“将结构体移动到类”来实现什么?或许对于你究竟想要做什么的澄清会有所帮助。 - stefanB
添加/澄清。这样好吗? - Kache
2个回答

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,您能否根据这些进行修改您的答案? - Jonathan Leffler

2

更准确地说,在您提供的代码片段中,Foo :: Data 不可访问。类成员默认为私有可见性。

其次,当您使用C ++时,不建议对结构声明使用typedef(还有其他有效的用途,但您的用法不是其中之一)。

请尝试使用此更正版本:

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

只是好奇,什么时候建议使用typedef来声明结构体? - Kache
在 C++ 中从不需要用到 typedef。在 C 中,如果你不使用 typedef,你就必须在每个地方说“struct that”,而 typedef 可以让你仅仅说“that”。在 C++ 中,你不需要使用 struct,因此 typedef 是无用的。typedef 有其他用法,特别是在模板存在的情况下,但 typedef 在类或结构体定义上是快速识别一个零经验 C++ 程序员的方法。 - Ben Voigt
其实,我这样做只是因为我在跟随用C语言编写的minizip和unrar库的示例。@.@ - Kache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接