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

时间:2010-02-04 06:41:24

标签: c++ visual-c++ g++

如果是,它应该做什么?

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

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

谢谢!

5 个答案:

答案 0 :(得分:8)

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

在C ++中,结构名称是一等公民。不需要使用来自C的旧typedef技巧。此外,dc应该在成员初始化列表中初始化。这将是有效的(更好的(C ++):

struct Foo {
  Dog d;
  Cat* c;
  Foo(Dog dog, Cat* cat) : d(dog), c(cat) {}
};

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

编辑:正如特拉维斯在评论中所说,您可能要考虑将dog作为const参考而不是复制它:

Foo(const Dog& dog, Cat* cat) : d(dog), c(cat) {}

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

答案 1 :(得分: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;

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

答案 2 :(得分:4)

大多数情况下,structtypedef是不必要的。用C ++编写得更好:

class Foo {
  public:
    Foo(Dog dog, Cat *cat) : d(dog), c(cat) {}
  private:
    Dog d;
    Cat *c;
};

行由行:

class Foo {

struct Foo相同。 classstruct之间C ++的唯一区别在于struct的成员默认是公开的,而class的成员是私有的。但我们需要一些公共成员,所以我们用...来解决这个问题。

  public:

此后的所有内容都是公开的,任何拥有Foo对象的人都可以访问。

    Foo(Dog dog, Cat *cat) : d(dog), c(cat) {}

这是Foo的构造函数。它会生成一个新的Foo对象,给定DogCat *: d(dog), c(cat)是初始化列表。除了可能更快之外,它与this->d = dog; this->c = cat;相同。如果您不想这样做,除非某处存在命名冲突,否则您可以不使用this->{}是函数体,为空,因为我们将赋值移动到初始化列表。

  private:

public:的对面。在此之后声明的内容只能在我们的课程中访问,并且仅供内部使用。

    Dog d;
    Cat *c;

这些是类的内部变量,例如struct的成员。

答案 3 :(得分:3)

这几乎是合法的,但有一个错误。结构就像一个类,除了默认保护是公共而不是私有。

好的,让我们分解一下:

// The next line is defining a struct called "Foo_struct", it's also
// saying it's going to give an alternate type name (that's the typedef).
// The alternate type name comes after the definition.
typedef struct Foo_struct{

  // The structure has a Dog element (this means we need to have seen
  // the definition of Dog already).
  Dog d;

  // And has a pointer to cat (this means we need to have at least seen
  // a declaration of Cat) 
  Cat* c;

  // Okay, this is definining a constructor.  The constructor must be
  // called with a Dog object and a pointer to a cat which the constructor
  // will save in the object.
  //
  // Here is the one error.  That 'struct' at the start shouldn't
  // be there (commenting out to make the code legal).
  /* struct */ Foo_struct(Dog dog, Cat* cat){ this->d = dog; this->c = cat;}

// And here we close out the struct and also finish off the typedef
// started on the first line.
} Foo;

答案 4 :(得分:0)

看起来它定义了一个名为Foo_Struct的结构,它包含一个Dog的实例,有一个指向cat的指针,并且有一个构造函数,它接受一个Dog的实例,指向Cat的指针,并将它们分配给它自己。 / p>

然后在堆栈上创建一个Foo实例。

编辑:我不确定第三行是构造函数还是其他东西。