如果是,它应该做什么?
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上);不知道这个代码是做什么的。)
谢谢!
答案 0 :(得分:8)
我认为不是。 (并Comeau同意我的意见。)你不能像这样定义一个构造函数。
在C ++中,结构名称是一等公民。不需要使用来自C的旧typedef
技巧。此外,d
和c
应该在成员初始化列表中初始化。这将是有效的(更好的(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
。具有最小更改
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)
大多数情况下,struct
和typedef
是不必要的。用C ++编写得更好:
class Foo {
public:
Foo(Dog dog, Cat *cat) : d(dog), c(cat) {}
private:
Dog d;
Cat *c;
};
行由行:
class Foo {
与struct Foo
相同。 class
和struct
之间C ++的唯一区别在于struct
的成员默认是公开的,而class
的成员是私有的。但我们需要一些公共成员,所以我们用...来解决这个问题。
public:
此后的所有内容都是公开的,任何拥有Foo
对象的人都可以访问。
Foo(Dog dog, Cat *cat) : d(dog), c(cat) {}
这是Foo的构造函数。它会生成一个新的Foo
对象,给定Dog
和Cat *
。 : 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实例。
编辑:我不确定第三行是构造函数还是其他东西。