C++ 作为其他类上的私有成员进行对象声明/初始化时出现问题
对不起,如果以前有人问过这个问题,我似乎找不到任何东西。我不知道如何搜索这个 我有这样的想法:C++ 作为其他类上的私有成员进行对象声明/初始化时出现问题,c++,class,object,initialization,declaration,C++,Class,Object,Initialization,Declaration,对不起,如果以前有人问过这个问题,我似乎找不到任何东西。我不知道如何搜索这个 我有这样的想法: class A { private: int x; int y; public: A(int, int); } class B { private: A a(3, 4); // Doesn't compile because of this line public: B(); } 我能想
class A {
private:
int x;
int y;
public:
A(int, int);
}
class B {
private:
A a(3, 4); // Doesn't compile because of this line
public:
B();
}
我能想到的解决这个问题的唯一方法是把a
作为a
的指针,然后做a=newa(3,4)代码>在B
的构造函数中。但我不希望a
成为指针
解决这个问题的正确方法是什么
class B {
private:
A a;
public:
B() : a(3,4) {}
};
在更广泛的意义上,解决方法是通过C++学习C++。是的,这很刺耳,但教程的要点是,它们以合理的顺序介绍概念,当它们告诉您有关数据成员时,它们将同时告诉您如何初始化它们
在更广泛的意义上,解决方法是通过C++学习C++。是的,这很刺耳,但教程的要点是,它们以合理的顺序引入概念,当它们告诉您有关数据成员时,它们将同时告诉您如何初始化它们。如果您希望用参数3和4初始化B.a,那么您可以在B的构造函数中这样做,例如
class B {
private:
A a;
public:
B(): a(3, 4) {}
}
如果您希望用参数3和4初始化B.a,那么您可以在B的构造函数中进行初始化,例如
class B {
private:
A a;
public:
B(): a(3, 4) {}
}
用“成员初始化列表”标记B
的构造函数。而不是:
B::B() {
...
}
您可以这样做:
B::B() : a(3, 4) {
...
}
或者,如果在标题中定义了构造函数:
class B {
private:
A a;
public:
B() : a(3, 4) {
...
}
};
用“成员初始化列表”标记B
的构造函数。而不是:
B::B() {
...
}
您可以这样做:
B::B() : a(3, 4) {
...
}
或者,如果在标题中定义了构造函数:
class B {
private:
A a;
public:
B() : a(3, 4) {
...
}
};
没有别的办法吗?如果我有几十个变量要初始化呢?代码看起来很奇怪。@ NasGuld:C++看起来很奇怪,如果你不熟悉它。直到有几十个数据成员和不止一个构造函数,这实际上不是问题。C++:看起来很奇怪。这是语言的一部分。忘掉它。也就是说,如果你真的讨厌语法,并且class A
有一个默认构造函数,它将自动使用;然后,您可以在构造函数中为a
(a=a(3,4);
)分配一个新值,但这是低效的。最好尽可能使用初始化列表,因为它可以更好地优化并生成更小/更快的代码。我是否可以假设这与将setVals
方法声明为a.setVals(3,4)在B
的构造函数中使用相同代码>?这也是低效的?这加上用a
的临时实例的内容实际替换a
的内容的成本。如果您没有为A
定义赋值运算符,那么本质上就是调用memcpy()
——如果您定义了,则是该方法的成本。因此,执行a=a(3,4)
的总成本将根据a类的实际类型而变化。只要克服对语法的厌恶,使用初始化列表即可。它将完全按照你需要的方式,是初始化C++中字段的正确方法。没有其他方法吗?如果我有几十个变量要初始化呢?代码看起来很奇怪。@ NasGuld:C++看起来很奇怪,如果你不熟悉它。直到有几十个数据成员和不止一个构造函数,这实际上不是问题。C++:看起来很奇怪。这是语言的一部分。忘掉它。也就是说,如果你真的讨厌语法,并且class A
有一个默认构造函数,它将自动使用;然后,您可以在构造函数中为a
(a=a(3,4);
)分配一个新值,但这是低效的。最好尽可能使用初始化列表,因为它可以更好地优化并生成更小/更快的代码。我是否可以假设这与将setVals
方法声明为a.setVals(3,4)在B
的构造函数中使用相同代码>?这也是低效的?这加上用a
的临时实例的内容实际替换a
的内容的成本。如果您没有为A
定义赋值运算符,那么本质上就是调用memcpy()
——如果您定义了,则是该方法的成本。因此,执行a=a(3,4)
的总成本将根据a类的实际类型而变化。只要克服对语法的厌恶,使用初始化列表即可。它将完全按照您需要的方式,是初始化C++中字段的正确方法。您所有定义的类型都是简单的POD型积分类型吗?如果是这样,您可以将它们创建为非类型模板参数。例如,A代码>。不过,这种方法有一些限制,其中一个是那些init值必须在编译时已知。您定义的所有类型都是简单的POD-like整数类型吗?如果是这样,您可以将它们创建为非类型模板参数。例如,A代码>。不过,这种方法有一些限制,其中之一是必须在编译时知道init值。