所以我有一个关于通过引用传递的问题。我尝试通过引用将对象传递给成员函数,并让该成员函数使用作为参数传递的引用调用另一个成员函数。但是,编译器说没有找到调用的成员函数。为什么会这样?下面的代码将用我的话语无法表达自己的方式来描述我的挫败感
// CODE 1
class someClass {
int data;
public:
someClass(someClass&);
someClass someFunction(const someClass&)
};
someClass::someClass(someClass &obj) {
data = obj.data;
}
someClass someClass::someFunction(const someClass &obj) {
someClass demo(obj); // <- this doesn't work
someClass demo(&obj); // <- neither does this
someClass demo(*obj); // <- or this
someClass demo2(*this); // <- this works though
}
很难理解这一点,这看起来似乎微不足道,但我确实感谢所有得到的帮助。此外,在xcode中发生了一些神秘的事情,当我尝试以下内容时(参考代码2),它可以工作。知道为什么吗?
// CODE 2
class someClass {
int data;
public:
someClass(someClass&);
void setData(int x) { data = x; }
};
int main() {
someClass first;
setData(10);
someClass second;
second = first;
//Mysteriously, it worked without overloading the '=' operator. Why?
//Also, I mentioned XCode just in case someone might say it's compiler specific
return 0;
}
答案 0 :(得分:2)
困难似乎如下:
someClass demo(obj);
您正在尝试将const引用传递给需要非const引用的函数。典型的模式是让复制构造函数采用const引用参数,这可以避免这个问题。
someClass demo(&obj);
在这种情况下,编译器正在寻找一个构造函数,该构造函数接受指向someClass的指针,但无法找到它。 &obj
会返回指向obj
的指针,而不是对obj
的引用。
someClass demo(*obj);
在这种情况下,您尝试取消引用obj
,就好像它是一个指针,但它是一个引用,而不是一个指针。
someClass demo2(*this);
这是有效的,因为您正在取消引用this
指针,该指针指向someClass
的实例。