C++ 为什么在ctor中不允许访问成员对象的成员?
类边缘:C++ 为什么在ctor中不允许访问成员对象的成员?,c++,syntax,constructor,initialization,member-initialization,C++,Syntax,Constructor,Initialization,Member Initialization,类边缘: class Edge { int dist = 0; std::pair<Node, Node> ends; public: Edge() = default; explicit Edge(const int idist) : dist(idist) { } explicit Edge(const int idist, Node& end1, Node& end2) : dist(idist) { en
class Edge {
int dist = 0;
std::pair<Node, Node> ends;
public:
Edge() = default;
explicit Edge(const int idist) : dist(idist) { }
explicit Edge(const int idist, Node& end1, Node& end2) : dist(idist) {
ends.first = end1;
ends.second = end2;
}
~Edge() = default;
};
这是不允许的。作为 虽然ends.first和ends.second不引用类或标识符,但它们是表达式。您必须初始化整个端点,例如
explicit Edge(const int idist, Node& end1, Node& end2) : dist(idist), ends(end1, end2) { }
这是不允许的。作为 虽然ends.first和ends.second不引用类或标识符,但它们是表达式。您必须初始化整个端点,例如
explicit Edge(const int idist, Node& end1, Node& end2) : dist(idist), ends(end1, end2) { }
你想做的是允许的,但你做的方式是不允许的 初始值设定项列表指定如何将包含未初始化字节的随机内存位转换为有效对象。然后,构造函数可以处理这个新对象,但是需要事先初始化对象状态。对于默认初始化导致的未初始化值,有一些警告,但在初始化器列表中唯一有效的操作是调用成员的构造函数。有关默认初始化的详细信息 在您的例子中,第一个和第二个字段是一对字段。在构建对之前,您无法访问它们。即使这样,您也不一定能以您尝试的方式重新初始化它们 解决方案是使用其构造函数之一立即初始化整个对: 显式Edgeconst int-idist,节点&end1,节点&end2:distidist,endsend1,end2{}
你想做的是允许的,但你做的方式是不允许的 初始值设定项列表指定如何将包含未初始化字节的随机内存位转换为有效对象。然后,构造函数可以处理这个新对象,但是需要事先初始化对象状态。对于默认初始化导致的未初始化值,有一些警告,但在初始化器列表中唯一有效的操作是调用成员的构造函数。有关默认初始化的详细信息 在您的例子中,第一个和第二个字段是一对字段。在构建对之前,您无法访问它们。即使这样,您也不一定能以您尝试的方式重新初始化它们 解决方案是使用其构造函数之一立即初始化整个对: 显式Edgeconst int-idist,节点&end1,节点&end2:distidist,endsend1,end2{}
< C++类的基本特征之一是,每个缺失恶意的对象都将被构造函数正确地创建。从另一个角度来看,如果一个类型有一个构造函数,那么您必须使用该构造函数创建该类型的对象 在Edge的构造函数初始值设定项列表中,将构造Edge的每个成员。由于std::pair有自己的构造函数,所以构造边缘对象意味着用std::pair的适当构造函数构造结束成员
这不是你应该绕过的。这是声音编程的基础。构造函数创建对象。做你自己的事情有可能创造出一些没有被正确创造的东西。是的,在这种特殊的情况下,你可能会侥幸逃脱。但是绕过构造函数并没有什么好处,在其他情况下,这将导致重大问题。不要绕过构造函数。让他们做他们的工作,这样你的工作就会容易得多。 < P>一个C++类的基本特征是,每个不存在恶意的对象都将被它的构造函数正确地创建。从另一个角度来看,如果一个类型有一个构造函数,那么您必须使用该构造函数创建该类型的对象 在Edge的构造函数初始值设定项列表中,将构造Edge的每个成员。由于std::pair有自己的构造函数,所以构造边缘对象意味着用std::pair的适当构造函数构造结束成员
这不是你应该绕过的。这是声音编程的基础。构造函数创建对象。做你自己的事情有可能创造出一些没有被正确创造的东西。是的,在这种特殊的情况下,你可能会侥幸逃脱。但是绕过构造函数并没有什么好处,在其他情况下,这将导致重大问题。不要绕过构造函数。让他们做他们的工作,这样你的工作就会容易得多。@code\u怪胎,不,我不认为这是一样的。我的编译器甚至抛出了一个不同的@code\u怪胎,不,我不认为它是一样的。我的编译器甚至抛出了一个不同的
explicit Edge(const int idist, Node& end1, Node& end2) : dist(idist), ends(end1, end2) { }