我试图初始化对象的数组:

SinglyLinkedList offeredClasses[22] = {SinglyLinkedList("CSCE101"),SinglyLinkedList("CSCE101L"),SinglyLinkedList("CSCE150E"),SinglyLinkedList("CSCE150EL"),SinglyLinkedList("CSCE150EM"),SinglyLinkedList("CSCE150EML"),SinglyLinkedList("CSCE155"),SinglyLinkedList("CSCE155H"),SinglyLinkedList("CSCE156"),SinglyLinkedList("CSCE230"),SinglyLinkedList("CSCE230L"),SinglyLinkedList("CSCE235"),SinglyLinkedList("CSCE251"),SinglyLinkedList("CSCE310"),SinglyLinkedList("CSCE322"),SinglyLinkedList("CSCE361"),SinglyLinkedList("CSCE351"),SinglyLinkedList("CSCE451"),SinglyLinkedList("CSCE423"),SinglyLinkedList("CSCE428"),SinglyLinkedList("CSCE486"),SinglyLinkedList("CSCE487")};

但是当我试图做到这一点一直试图调用,而不是一个重载的构造我的拷贝构造函数。任何想法解决这一问题?

2种构造中的问题是:

SinglyLinkedList(string course); //Constructor
SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

我需要其他的东西拷贝构造函数,所以我无法将其删除。

感谢您的帮助!

有帮助吗?

解决方案

这似乎theat你的编译器被严重损坏。你的拷贝构造函数声明为带非const引用参数。这样的拷贝构造不能与临时对象作为参数来调用,因为非const引用不能被绑定到一个临时对象。

您初始化是暂时的对象,这意味着有绝对没有办法拷贝构造函数都可以在这里调用。如果你的编译器做它,这意味着它有损坏,或者您使用的是一些组设置,使其在一个奇怪的不符合规定的行为方式。您正在使用哪种编译器?

这是答案的第一部分。

第二部分是,大括号内的初始化列表是使用C解释为复制初始化++。换言之,该拷贝构造的必须可以在这种情况下被调用。有没有办法解决它(电话以后可以优化掉,但构造函数必须在任何情况下可用)。在这一点上,你的编译器行为是“正确”的,即它使试图调用拷贝构造函数,因为它应该。除此之外,正如我上面所说,你的情况应该发出一个错误(因为拷贝构造函数是不可调用的),而不是quetly调用它。

和,最后,答案的第三部分。

您是说拷贝构造函数被调用的代替的转换构造。在现实中,的两个的调用。如果你仔细看,你会看到它。首先,转化构造函数被调用,以创建从你提供的字符串“SinglyLinkedList”类型的中间临时对象(包括构建临时“的std :: string”对象为好),并然后复制构造函数被调用,以初始化从临时数组元素(这种情况对每一个单元阵列中)。这是应该如何在C ++中,假设你拷贝constrcutor用const引用参数正确声明,即。但随着非const基准参数,所述拷贝构造不调用和是形成不良的代码。

其他提示

当你有单个参数构造总是声明它们explicit,e.g。

explicit SinglyLinkedList(string course); //Constructor
explicit SinglyLinkedList(SinglyLinkedList & otherObj); //Copy Constructor

您调用正确的构造函数的更好的机会的方式。

在另一方面,该构造函数的编译器正在搜索是SinglyLinkedList( const char* )。试图直接创建字符串实例,e.g SinglyLinkedList( string("CSCE101") )

您所呼叫的construcors的签名     SinglyLinkedList(字符常量*)

,你没有提供所以,要么产生constructotr服用字符常量*或称他们为SinglyLinkedList(字符串(“CSCE101”))

有距离的char *的隐式转换到std ::串 - 让你的编译器必须了解哪些重载比赛和它找到匹配SinglyLinkedList

您可能想尝试改变你的构造函数声明为:

explicit SinglyLinkedList(std::string const& name);
SinglyLinkedList(SinglyLinkedList const& other);

然后加入在赋值操作符和析构函数:

~SinglyLinkedList();
SinglyLinkedList& operator=(SinglyLinkedList const& other);

我很惊讶,它被编译,因为在所有没有consts两个构造函数应该是模糊的。

你有什么需要的拷贝构造函数是不可复制建筑?如果你需要它别的东西,那么你需要改变其他事情。它使真的很难理解的代码,即使你忽略目前像你这样的问题之苦。这是人们通过做这样的事情重载operator ^做跨产品在数学库导致同样的问题。

使用事情他们是为了什么要用于防止以后的问题,同时使你的代码很多时候更容易维护。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top