用C ++初始化数组

时间:2009-10-12 16:46:22

标签: c++ arrays copy-constructor

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

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

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

感谢您的帮助!

5 个答案:

答案 0 :(得分:6)

看来您的编译器严重破坏了。您的copy-constructor使用非const引用参数声明。无法使用临时对象作为参数调用此类复制构造函数,因为非const引用不能绑定到临时对象。

您的初始化程序是临时对象,这意味着绝对没有办法在此处调用复制构造函数。如果您的编译器执行此操作,则意味着它已损坏,或者您正在使用某些设置使其以非常不合规的方式运行。您使用的是哪种编译器?

这是答案的第一部分。

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

最后,答案的第三部分。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

你没有提供所以要么生成一个使用char const *的constructotr,要么将它们称为SinglyLinkedList(string(“CSCE101”))

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

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:-2)

对于那个IS NOT拷贝构造,你需要什么样的拷贝构造函数?如果您需要其他东西,那么您需要改变其他东西。即使您忽略了目前正在遭受的问题,也很难理解代码。这是人们在数学库中通过重载operator ^来做一个跨产品这样的问题。

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