C++ 传入引用与指针

C++ 传入引用与指针,c++,C++,将newTemp传递到setEmergencyContact()时出错。我得到的错误是关于: temp->Contact::setEmergencyContact(newTemp); “错误:没有对‘Contact::setEmergencyContact(*&Contact)’的匹配函数调用” 所以我的问题是:如果必须使用指针创建对象,如何将对象传递给使用引用而不是指针的函数 Contact generateRandomContact(){ // The name w

newTemp传递到setEmergencyContact()时出错。我得到的错误是关于:

temp->Contact::setEmergencyContact(newTemp);
“错误:没有对‘Contact::setEmergencyContact(*&Contact)’的匹配函数调用”

所以我的问题是:如果必须使用指针创建对象,如何将对象传递给使用引用而不是指针的函数

 Contact generateRandomContact(){
        // The name will be created with
        // generateRandomName() and phone number will be created with
        // generateRandomNumber(). Using the above random function,
        // with 50% probability assign a new Contact as the emergencyContact
        // of the one just generated. Otherwise leave it NULL (default).
        // Then return this Contact.

Contact* temp = new Contact;
temp->Contact::changeName(generateRandomName());
temp->Contact::changeNumber(generateRandomNumber());
    if(myrand(11) % 2 != 0){
      Contact* newTemp = new Contact;
      temp->Contact::setEmergencyContact(newTemp);
   }

return *temp;  
}
紧急联络功能:

void Contact::setEmergencyContact(Contact & _emergencyContact){
Contact* changeEmergencys = new Contact;
changeEmergencys = emergencyContact->getEmergencyContact();
}
取消引用它:

temp->setEmergencyContact(*newTemp)
取消引用它:

temp->setEmergencyContact(*newTemp)
要么公正

void Contact::setEmergencyContact(Contact * _emergencyContact)
要使用您的代码,请仍然使用
->
而不是

但是,如果要修改指针本身,可以使用

void Contact::setEmergencyContact(Contact* & _emergencyContact) {
    Contact* changeEmergencys = new Contact;
    changeEmergencys = _emergencyContact->getEmergencyContact();
}
请注意,如果取消引用,则必须使用
而不是
->

void Contact::setEmergencyContact(Contact & _emergencyContact) {
    Contact* changeEmergencys = new Contact;
    changeEmergencys = _emergencyContact.getEmergencyContact();
}
要么公正

void Contact::setEmergencyContact(Contact * _emergencyContact)
要使用您的代码,请仍然使用
->
而不是

但是,如果要修改指针本身,可以使用

void Contact::setEmergencyContact(Contact* & _emergencyContact) {
    Contact* changeEmergencys = new Contact;
    changeEmergencys = _emergencyContact->getEmergencyContact();
}
请注意,如果取消引用,则必须使用
而不是
->

void Contact::setEmergencyContact(Contact & _emergencyContact) {
    Contact* changeEmergencys = new Contact;
    changeEmergencys = _emergencyContact.getEmergencyContact();
}

编辑函数以获取指针:

void Contact::setEmergencyContact(Contact * _emergencyContact)
或者按照zmbq的建议取消对传递指针的引用


我看到您正在使用大量的new和delete,我不得不推荐智能指针,并尽量减少new和delete的使用。

编辑函数以获取指针:

void Contact::setEmergencyContact(Contact * _emergencyContact)
或者按照zmbq的建议取消对传递指针的引用



我看到您使用了很多new和delete,我不得不推荐智能指针,并尽量减少new和delete的使用。

太多了
new
,您是想标记这个
java
?(显然不是,但是请你把这些无用的指针去掉)一个新的临时工对我来说似乎有点可疑。。
setEmergencyContact()
是否拥有所有权并在以后删除?否则,您将使用新的内存泄漏
newTemp
temp
看起来都很可能是内存泄漏。您的代码中似乎有几个打字错误,比如使用
emergencyContact
而不是
\u emergencyContact
以及类似的错误。@RaphaelMiedl它稍后会删除,很抱歉没有包含该代码,user35443我将重命名它们,在我的代码中,它可能更清楚。@ GRILO现代C++代码不应该使用已拥有的原始指针(甚至有些人甚至使用单独的类来借用原始指针),并且完全避免
new
/
delete
,而支持
make_unique
/
make_shared
或者仅仅通过值来拥有对象。太多的
new
,你是想标记这个
java
?(显然不是,但是请你把这些无用的指针去掉)一个新的临时工对我来说似乎有点可疑。。
setEmergencyContact()
是否拥有所有权并在以后删除?否则,您将使用新的内存泄漏
newTemp
temp
看起来都很可能是内存泄漏。您的代码中似乎有几个打字错误,比如使用
emergencyContact
而不是
\u emergencyContact
以及类似的错误。@RaphaelMiedl它稍后会删除,很抱歉没有包含该代码,user35443我将重命名它们,在我的代码中,它可能更清楚。@ GRILO现代C++代码不应该使用已拥有的原始指针(甚至有些人甚至使用单独的类来借用原始指针),并且完全避免
new
/
delete
,而支持
make_unique
/
make_shared
或者仅仅通过值来拥有对象。太多的
new
,你是想标记这个
java
?(显然不是,但是请你把这些无用的指针去掉)一个新的临时工对我来说似乎有点可疑。。
setEmergencyContact()
是否拥有所有权并在以后删除?否则,您将使用新的内存泄漏
newTemp
temp
看起来都很可能是内存泄漏。您的代码中似乎有几个打字错误,比如使用
emergencyContact
而不是
\u emergencyContact
以及类似的错误。@RaphaelMiedl它稍后会删除,很抱歉没有包含该代码,user35443我将重命名它们,在我的代码中,更清楚的是,GRILO现代C++代码不应该使用自有的原始指针(甚至有些人甚至使用一个单独的类来借用原始指针),并且完全避免<代码>新的< /代码> />代码>删除<代码>,以支持<代码> MaxION/<代码> /Max>共享My/<代码>或仅按值拥有对象。我仍然难以理解带函数指针的概念。谢谢你的帮助。这很有效,我仍然难以理解带函数指针的概念。谢谢你的帮助。这很有效,我仍然难以理解带函数指针的概念。谢谢你的帮助。