错误 1 error C2664: “NoName::NoName(const NoName &)”: 不能将参数 1 从“const char [5]”转换为

时间:2020-12-08 20:18:33

#include "stdafx.h"

#include <iostream>  
#include <string>
using namespace std;  

struct NoName
{
NoName():pstring(new string),i(0),d(0) { }

NoName(const NoName &temp)
{
cout<<"载入拷贝构造函数"<<endl;

pstring=new string;
*pstring=*(temp.pstring);

i=temp.i;
d=temp.d;
}

~NoName()
{
cout<<"载入析构函数!"<<endl;
delete [] pstring;
cin.get();
}
void show();
private:
string *pstring;
int i;
double d;
};

void NoName::show()
{
cout<<pstring<<endl;
}

int main()
{
NoName abc("asdf");
NoName b=abc;

b.show();

return 0;
}


出现编译错误  错误 1 error C2664: “NoName::NoName(const NoName &)”: 不能将参数 1 从“const char [5]”转换为“const NoName &” d:\cplusplus\primer\primeroct29\primeroct29\primeroct29.cpp 44


究竟是什么原因啊?难道我这样初始化有问题吗?求大侠相助!谢谢!

7 个解决方案

#1


 NoName(const NoName &temp)
 NoName abc("asdf");

看看区别

#2


如果要使程序运行
可以 NoName(char *str)定义一个这样的构造函数

另:到目前还没见过可以 new string的,建议换成char试试

#3


#include "stdafx.h"

#include <iostream>  
#include <string>
using namespace std;  

struct NoName
{
NoName():pstring(new string),i(0),d(0) { }

NoName(const string &temp)
{
cout<<"载入构造函数"<<endl;

pstring=new string;
//*pstring=*(temp.pstring);
*pstring = temp;

//i=temp.i;
//d=temp.d;
}
NoName(const NoName &temp)
{
cout<<"载入拷贝构造函数"<<endl;

pstring=new string;
*pstring=*(temp.pstring);
i=temp.i;
d=temp.d;
}


~NoName()
{
cout<<"载入析构函数!"<<endl;
delete  pstring;
cin.get();
}
void show();
private:
string *pstring;
int i;
double d;
};

void NoName::show()
{
cout<< *pstring << endl;
}

int main()
{
NoName abc("asdf");
NoName b=abc;

b.show();

return 0;
}

#4


多谢2位相助,这真的明白了构造函数和拷贝构造函数应该如何写,尤其是getline大侠,多谢!!

#5


NoName abc("asdf");
这个地方的absf不是一个NoName类的对象 而是一个字符串

#6



#include <iostream>  
#include <string>
using namespace std;  

struct NoName
{
    NoName( string *str ):pstring( str ),i(0),d(0) { }
    
    NoName(const NoName &temp)
    {
        cout<<"载入拷贝构造函数"<<endl;

        pstring=new string;
        *pstring=*(temp.pstring);

        i=temp.i;
        d=temp.d;
    }

    ~NoName()
    {
        cout<<"载入析构函数!"<<endl;
        delete pstring;
        cin.get();
    }
    void show();
private:
    string *pstring;
    int i;
    double d;
};

void NoName::show()
{
    cout<<*pstring<<endl;
}

int main()
{
string a("sdfsdfa");
string *str;
str = new string;
str = &a;
    NoName abc(str);
    NoName b=abc;

    b.show();

    return 0;
}




#7


拷贝构造函数只有一个,但其它构造函数可以有多个(重载实现),因此一般你要传什么参数给构造函数,就应该编写相应的重载形式;
另,析构函数中 delete [] pstring; 做法不对,要使用相同形式的new和delete版本(这里应该是delete pstring)。

#1


 NoName(const NoName &temp)
 NoName abc("asdf");

看看区别

#2


如果要使程序运行
可以 NoName(char *str)定义一个这样的构造函数

另:到目前还没见过可以 new string的,建议换成char试试

#3


#include "stdafx.h"

#include <iostream>  
#include <string>
using namespace std;  

struct NoName
{
NoName():pstring(new string),i(0),d(0) { }

NoName(const string &temp)
{
cout<<"载入构造函数"<<endl;

pstring=new string;
//*pstring=*(temp.pstring);
*pstring = temp;

//i=temp.i;
//d=temp.d;
}
NoName(const NoName &temp)
{
cout<<"载入拷贝构造函数"<<endl;

pstring=new string;
*pstring=*(temp.pstring);
i=temp.i;
d=temp.d;
}


~NoName()
{
cout<<"载入析构函数!"<<endl;
delete  pstring;
cin.get();
}
void show();
private:
string *pstring;
int i;
double d;
};

void NoName::show()
{
cout<< *pstring << endl;
}

int main()
{
NoName abc("asdf");
NoName b=abc;

b.show();

return 0;
}

#4


多谢2位相助,这真的明白了构造函数和拷贝构造函数应该如何写,尤其是getline大侠,多谢!!

#5


NoName abc("asdf");
这个地方的absf不是一个NoName类的对象 而是一个字符串

#6



#include <iostream>  
#include <string>
using namespace std;  

struct NoName
{
    NoName( string *str ):pstring( str ),i(0),d(0) { }
    
    NoName(const NoName &temp)
    {
        cout<<"载入拷贝构造函数"<<endl;

        pstring=new string;
        *pstring=*(temp.pstring);

        i=temp.i;
        d=temp.d;
    }

    ~NoName()
    {
        cout<<"载入析构函数!"<<endl;
        delete pstring;
        cin.get();
    }
    void show();
private:
    string *pstring;
    int i;
    double d;
};

void NoName::show()
{
    cout<<*pstring<<endl;
}

int main()
{
string a("sdfsdfa");
string *str;
str = new string;
str = &a;
    NoName abc(str);
    NoName b=abc;

    b.show();

    return 0;
}




#7


拷贝构造函数只有一个,但其它构造函数可以有多个(重载实现),因此一般你要传什么参数给构造函数,就应该编写相应的重载形式;
另,析构函数中 delete [] pstring; 做法不对,要使用相同形式的new和delete版本(这里应该是delete pstring)。