提问者:小点点

strcpy不使用类中的字符串指针


我是C++的新手,我做了一个简单的程序,根据你的输入来命名类的成员。 但是由于某种原因,编译器显示了这个错误-'str':不是'std::basic_string,std::allocator>的成员,我无法理解它的含义。 请帮帮我这是我的密码-

#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()函数有问题。 谢谢


共3个答案

匿名用户

strcpy没有什么问题,但问题在于您如何使用它。 std::strings可以与其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

但我会把这个留给你的。