【问题标题】:strcpy not working with string pointer in a classstrcpy 不适用于类中的字符串指针
【发布时间】:2020-10-24 04:54:03
【问题描述】:

我是 C++ 新手。我制作了一个简单的程序,根据您的输入命名类的成员。 但由于某种原因,编译器显示此错误 - 'str': is not a member of 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>',我无法理解它的含义。 请帮帮我 这是我的代码 -

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

【问题讨论】:

  • 有很多错别字,试着改正
  • 您似乎将 std::string 类与 C 风格的 char* 字符串混淆了。
  • strcpy(this-&gt;str, strthing.str); 应该是 *this-&gt;str = strthing.str;。你也应该关注The Rule of Three
  • 你需要str 成为一个指向 std::string 而不仅仅是一个std::string 的机会非常渺茫,同样对@ 的必要性提出了质疑首先是 987654332@。
  • 另外delete [] str; 不好,因为str 不是通过new[] 分配的。

标签: c++ string class oop object


【解决方案1】:

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(无指针),或者如果这是编写自己的字符串类的练习(不是一个简单的类!),那么您可能应该将数据存储在chars 的数组中。

你得到的错误是关于strthing.str。这里strthing 是一个std::string,它没有str 成员。如果该构造函数应该是一个复制构造函数,它应该将const mystring&amp; 作为参数而不是const std::string&amp;

【讨论】:

  • 谢谢,在阅读了您的回答后,我尝试这样做this-&gt;*str = strthing.*str;,但它给了我这个错误--&gt;*': illegal, right operand has type 'std::string *'
  • @default-303 应该是*str = *(strthing.str);
  • 所以你们这些人我不能在我的代码中使用this-&gt;.*?这是我应该坚持的语法吗??
  • @default-303 你可以使用this-&gt; 但在成员函数内部它是多余的。在成员函数 str 内部确实已经引用了名为 str 的成员
  • @default-303 它将是*this-&gt;str = *strthing.str;。使用括号它可以做到这一点:*(this-&gt;str) = *(strthing.str); 首先你得到 strthing.str (它是一个指针),然后你用 * 查看它指向的东西
【解决方案2】:

您不要使用 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

但我会把它留给你。

【讨论】:

    【解决方案3】:

    这只是一个错字。

     mystring::mystring(const std::string& strthing)  
    

    应该是

    mystring::mystring(const mystring& strthing)  
    

    【讨论】:

    • 不“只是”仍然会调用 strcpy 并带有指向 std::string 的指针
    • 这不是问题要问的内容
    • OP 从未明确表示他们打算编写复制构造函数,因此您还应该考虑其他可能性
    • 抱歉,他们做到了;)
    • 是的,我只是在解决报告的编译错误。 OP 可以解决其他问题。
    【解决方案4】:

    在 C++ 类型 std::string 和 C 类型 'char*' 之间存在一个 C++ 陷阱。

    std::string 可以使用std::string.c_str() 转换为char*

    strcpychar*char const * 作为参数。

    在现代C++实践中,通常使用std::string,不建议使用std::string *

    如果要将strcpystd::string 一起使用,则必须在char *std::string 之间进行转换。下面是一个简单的例子:

        std::string dest;
        std::string source = "Hello, World!";
        char temp[40];
        strcpy(temp, source.c_str());
        dest = temp;
    

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 2018-05-08
      • 2020-03-27
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2013-11-06
      • 2014-08-06
      • 2023-03-31
      相关资源
      最近更新 更多