微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在ctor中不允许访问成员对象的成员?

如何解决为什么在ctor中不允许访问成员对象的成员?

边缘类:

<ipython-input-14-82df91b172c5> in <module>
      1 for column in original_data:
----> 2     original_data['alert'] = np.where(((original_data[original_data.columns[column]] >= original_data[original_data.columns[column+'_ma']]) or (original_data[original_data.columns[column]] <= original_data[original_data.columns[column+'_ma']])),'T','F')
      3 

~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in __getitem__(self,key)
   3928         if is_scalar(key):
   3929             key = com.cast_scalar_indexer(key)
-> 3930             return getitem(key)
   3931 
   3932         if isinstance(key,slice):

IndexError: only integers,slices (`:`),ellipsis (`...`),numpy.newaxis (`None`) and integer or boolean arrays are valid indices

在ctor 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; }; 中,为什么不允许使用该语法?:

explicit Edge(const int idist,Node& end2)

解决方法

这是不允许的。作为member initializer list的语法,

class-or-identifier ( expression-list(optional) ) (1) 
class-or-identifier brace-init-list   (2) (since C++11)

尽管ends.firstends.second没有引用类或标识符,但它们是表达式。您必须全部初始化ends,例如

explicit Edge(const int idist,Node& end1,Node& end2) : dist(idist),ends(end1,end2) { }
,

允许您尝试执行的操作,但是您执行操作的方法是不允许的。

初始化程序列表指定如何将包含未初始化字节的内存的随机位转换为有效对象。然后,构造函数可以使用此新对象执行操作,但是对象状态需要事先进行初始化。对于默认初始化导致的未初始化值的一些警告,但是在初始化列表中唯一有效的事情是调用成员的构造函数。 ({See here有关默认初始化的更多信息。)

在您的情况下,firstsecondpair的字段。您必须先构建一对,然后才能访问它们。即使那样,您也不一定可以按照您尝试的方式重新初始化它们。

解决方案是使用其构造函数之一立即初始化整个对:

explicit Edge(const int idist,end2) { }
,

C ++类的基本特征之一是,每个对象(不存在恶意对象)都将由其构造函数正确创建。从另一个角度看,如果一个类型具有构造函数,那么您必须使用构造函数创建该类型的对象

Edge的构造方法初始值设定项列表中,Edge的每个成员都将被构造。由于std::pair有其自己的构造函数,因此构造Edge对象意味着使用ends的适当构造函数构造该std::pair成员。

这不是您应该尝试绕过的东西。这是声音编程的基础。构造函数创建对象。自己做的事情有创建未正确创建的事情的风险。是的,在这种情况下,您可能可以摆脱它。但是,绕过构造函数没有任何好处,在其他情况下,这将导致严重的问题。不要绕过构造函数。让他们去做他们的工作,这样您的工作就会容易得多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。