是以下有效的C++代码?

ano*_*non 1 c++ g++ visual-c++

如果是的话,该怎么办?

typedef struct Foo_struct{
  Dog d;
  Cat* c;
  struct Foo_struct(Dog dog, Cat* cat){ this->d = dog; this->c = cat;}
} Foo;
Run Code Online (Sandbox Code Playgroud)

(背面故事:将用Visual C++(在Windows上)编写的程序移植到g ++(在MacOSX上);不知道这个代码是什么样的.

谢谢!

sbi*_*sbi 8

我认为不是.(和Comeau同意我的意见.)你不能像这样定义一个构造函数.

在C++中,结构名称是一等公民.有没有必要聘请老typedef从C.招此外,dc应该在成员初始化列表中被初始化.这将是有效的(更好的(C++):

struct Foo {
  Dog d;
  Cat* c;
  Foo(Dog dog, Cat* cat) : d(dog), c(cat) {}
};
Run Code Online (Sandbox Code Playgroud)

该代码定义了一个结构(在C++中,与一个类相同,除了它的成员默认是公共的),并带有一个构造函数,用于在创建时初始化其成员.

编辑:作为特拉维斯在他的评论中说,你可能要考虑通过dog作为const参考,而不是将其复制:

Foo(const Dog& dog, Cat* cat) : d(dog), c(cat) {}
Run Code Online (Sandbox Code Playgroud)

如果Dog(我们还没有看到)是一个具有多个内置成员的类,这可能比每个副本传递它要便宜得多.

  • 或者更好的是`美孚(const的狗和狗,猫*猫):d(狗),C(CAT){}`...避免实例化'D'只是一个参数覆盖它的开销.通过引用传递更便宜,更多的C++. (3认同)

ken*_*ytm 5

不,这不对.你不能拥有struct构造函数.一个有效的C++代码以最小的变化

typedef struct Foo_struct{
  Dog d;
  Cat* c;
  Foo_struct(Dog dog, Cat* cat){ this->d = dog; this->c = cat;}  // <-- remove the "struct"
} Foo;
Run Code Online (Sandbox Code Playgroud)

有关更好的方法,请参阅@ sbi的答案.