0

我正在尝试初始化一个对象数组:

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

我需要其他东西的复制构造函数,所以我不能删除它。

谢谢你的帮助!

4

5 回答 5

6

看来您的编译器严重损坏。您的复制构造函数是使用非常量引用参数声明的。这样的复制构造函数不能用临时对象作为参数调用,因为非常量引用不能绑定到临时对象。

您的初始化程序是临时对象,这意味着绝对不能在这里调用复制构造函数。如果您的编译器这样做,则意味着它已损坏,或者您正在使用某些设置使其以奇怪的不合规方式运行。您使用的是哪个编译器?

这是答案的第一部分。

第二部分是大括号括起来的初始化列表在 C++ 中被解释为复制初始化。换句话说,在这种情况下必须调用复制构造函数。没有办法绕过它(调用可以稍后优化掉,但构造函数必须在任何情况下都可用)。在这方面,您的编译器的行为“正确”,即它尝试调用复制构造函数,因为它应该这样做。除了,正如我上面所说,在你的情况下,它应该发出一个错误(因为复制构造函数不可调用)而不是悄悄地调用它。

最后,答案的第三部分。

您是说调用了复制构造函数而不是转换构造函数。实际上,两者都被调用。如果你仔细看,你会看到的。首先,调用转换构造函数,以便从您提供的字符串中创建一个“SinglyLinkedList”类型的中间临时对象(这也涉及构造一个临时“std::string”对象),然后调用复制构造函数为了从临时初始化数组元素(这发生在数组中的每个元素上)。这就是它在 C++ 中的样子,假设您的 copy-constrcutor 声明正确,即使用 const 引用参数。但是对于非常量引用参数,复制构造函数是不可调用的,并且代码格式不正确。

于 2009-10-12T16:59:49.030 回答
1

当你有单参数构造函数时,总是声明它们explicit,例如

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

这样你就有更好的机会调用正确的构造函数。

另一方面,构造函数编译器正在搜索 is SinglyLinkedList( const char* )。尝试直接创建字符串实例,例如SinglyLinkedList( string("CSCE101") )

于 2009-10-12T17:06:15.757 回答
0

您可能想尝试将构造函数声明更改为:

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

然后添加赋值运算符和析构函数:

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

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

于 2009-10-12T17:06:56.600 回答
0

您正在调用的构造函数的签名是 SinglyLinkedList( char const * )

你没有提供的所以要么产生一个使用 char const* 的构造函数,要么将它们称为 SinglyLinkedList(string( "CSCE101" ))

没有从 char* 到 std::string 的隐式转换 - 因此您的编译器必须查看哪个重载匹配并找到匹配的 SinglyLinkedList。

于 2009-10-12T17:04:37.540 回答
-2

对于 ISN'T 复制构造,您需要什么复制构造函数?如果您需要它来做其他事情,那么您需要更改其他事情。即使您忽略了当前正在遭受的问题,它也会使代码很难理解。这与人们在数学库中通过重载 operator^ 来做叉积等事情引起的问题相同。

将事物用于它们的用途并防止以后出现问题,同时使您的代码更易于维护。

于 2009-10-12T16:52:27.830 回答