我是C++的新手,我做了一个简单的程序,根据你的输入来命名类的成员。 但是由于某种原因,编译器显示了这个错误-'str':不是'std::basic_string
的成员,我无法理解它的含义。 请帮帮我这是我的密码-
#include <iostream>
#include <string>
#include <vector>
class mystring
{
private:
std::string *str;
public:
//constructors
mystring();
mystring(const std::string &strthing);
~mystring();
//methods
void display() const;
};
mystring::mystring() //defalt constructor
:str(nullptr)
{}
mystring::mystring(const std::string& strthing) //copy constructor
:str(nullptr)
{
delete str;
str = new std::string;
strcpy(this->str, strthing.str);
std::cout << "overloaded\n";
}
mystring::~mystring() //destructor
{
delete [] str;
}
void mystring::display() const //display func
{
std::cout << *str;
}
int main()
{
mystring thing;
mystring object{ "samurai" };
object.display();
}
我认为重载构造函数中的strcpy()
函数有问题。 谢谢
strcpy
没有什么问题,但问题在于您如何使用它。 std::string
s可以与其operator=
:
std::string a;
std::string b;
a = b; // copy b to a
另一方面,strcpy
用于C字符串,而std::string
不是:
char* strcpy( char* dest, const char* src );
不清楚为什么您具有指向std::string
的类型指针的成员。 您应该使用std::string
(没有指针),或者如果这是编写您自己的string类的练习(不容易!) 那么您可能应该将数据存储在char
数组中。
您得到的错误是关于strthing.str
的。 这里的strthing
是一个std::string
,它没有str
成员。 如果该构造函数被认为是复制构造函数,它应该将常量mystring&
作为参数,而不是常量std::string&
。
这只是一个打字错误。
mystring::mystring(const std::string& strthing)
应该是
mystring::mystring(const mystring& strthing)
不使用strcpy
复制std::string
对象。 下面是正确重写的构造函数(它不是复制构造函数,因为它不复制MyString
对象)
mystring::mystring(const std::string& strthing) // constructor from std::string
: str(new std::string(strthing)) // allocate new string by copying from strthing
{
std::cout << "overloaded\n";
}
因为您的类分配内存(不知道为什么要分配,但确实是这样),所以您实际上需要编写一个真正的副本构造函数和赋值运算符
mystring::mystring(const mystring& strthing) // copy constructor
mystring& mystring::operator=(const mystring& strthing) // assignment operator
但我会把这个留给你的。