我试图在一个类中实例化一个类,以便外部类包含内部类。
这是我的代码:
#include <iostream>
#include <string>
class Inner {
private:
std::string message;
public:
Inner(std::string m);
void print() const;
};
Inner::Inner(std::string m) {
message = m;
}
void Inner::print() const {
std::cout << message << std::endl;
std::cout << message << std::endl;
}
class Outer {
private:
std::string message;
Inner in;
public:
Outer(std::string m);
void print() const;
};
Outer::Outer(std::string m) {
message = m;
}
void Outer::print() const {
std::cout << message << std::endl;
}
int main() {
Outer out("Hello world.");
out.print();
return 0;
}
“Inner in”是我尝试将内部包含在外部中,但是,当我编译时,我收到一个错误,指出没有匹配的函数来调用 Inner::Inner()。 我做错了什么?
谢谢。
最佳答案
您需要使用初始化列表来初始化类成员:
Inner::Inner(const std::string& m)
: message(m)
{
}
Outer::Outer(const std::string& m)
: in(m)
{
}
(请注意,我按 const
引用传递了字符串,这比按值传递它们要好。有关如何传递函数参数,请参阅 this answer。)
通过这种方式,您可以准确指定应该为类成员调用哪些构造函数。
如果您不指定构造函数,将隐式调用默认构造函数。稍后分配给对象将调用赋值运算符并覆盖默认构造函数将对象初始化为的任何内容。这充其量是在浪费性能。
由于我们的 Inner
没有默认构造函数(声明任何构造函数都会阻止编译器自行定义默认构造函数),因此无法调用它,因此您需要 明确指定采用字符串的构造函数。
编辑:请注意,如果您有多个类成员,它们都会以这种方式初始化,并以逗号分隔:
Outer::Outer(const std::string& m) : in1(m), in2(m), in3() {}
请注意,类成员的初始化顺序由它们在类定义中的声明顺序决定,而不是它们在初始化列表中出现的顺序。最好不要依赖初始化顺序,因为在类定义中更改它会在构造函数的定义中产生一个非常微妙的错误。如果您无法避免,请在类成员声明之外添加注释:
class outer {
public:
outer(const inner& in)
: in_(in), rin_(in_) // depends on proper declaration order of in_ and rin_
{}
private:
inner in_; // declaration order matters here!1
inner& rin_; // (see constructor for details)
};
基类构造函数的指定方式相同,它们在类成员之前初始化,也是按照基类列表中的声明顺序。然而,虚基类在所有非虚基类之前被初始化。
析构函数,顺便说一句,总是以与构造函数相反的顺序被调用。你可以依靠它。
关于c++ - 在类中实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2938467/