我的练习代码中的C++代码错误

shb*_*hbz -6 c++

你能帮帮我解决这个问题吗?

#include <iostream>
#include <cstring>

using namespace std;

class A
{
public:
    char str[4];

    A()
    {
        str = "C++";
        cout << "Constructor A" << endl;
    }

    void display()
    {
        cout << str << " is your name" << endl;
    }
};

int main()
{
    A a;
    a.display();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了以下错误:

**************************Error********** 
StringProg.cpp:9: error: ISO C++ forbids initialization of member "str" 
StringProg.cpp:9: error: making "str" static StringProg.cpp:9: error: invalid in-class initialization of static data member of non-integral type "char [4]"
StringProg.cpp: In member function "void A::display()":
StringProg.cpp:17: error: "str" was not declared in this scope
**************************
Run Code Online (Sandbox Code Playgroud)

Bar*_*icz 7

C数组存在很多问题,导致您无法执行您想要执行的操作.

  • 字符串文字的类型为const char[n](字符n长度为+ 1 \0).要在C标准库函数中使用它们,它们会衰减到const char*,它们不具有字符串的大小,并且为了找到它,需要遍历字符串(每个字符都被查看并与之比较\0)

  • 因此,数组赋值运算符需要相当重要; 这不是由语言提供的,您必须使用库函数strcpy来将文字移动到可用内存中.换句话说,您不能像其他值一样分配C数组.

  • 数组以非常原始的方式运行; 它们没有用于比较的运算符,将它们传递给函数并在类中正确存储更加困难.

因此,由于上述所有......

宁愿std::stringchar[]:

class A {
    std::string str;

public:
    // prefer constructor init list
    A() : str("C++") {
        // your line would work, too
        std::cout << "Constructor A" << std::endl;
    }

    void display() const {
        std::cout << str << " is your name" << std::endl;
    }
};

int main()
{
    A a;
    a.display();
    // return 0; is unnecessary
}
Run Code Online (Sandbox Code Playgroud)

一些"经验法则"(拇指规则?):如果您需要多个元素,请从头开始vector<>.永远不要使用C数组.string一个元素,而不是"字符数组".

  • @VladfromMoscow它没有必要.通过避免复杂的低级解决方案,OP可以以一种可理解的方式更容易地解决他的问题,并且只有在他真正想要或需要时才回到原始概念.我发现没有必要在语言的遗留部分上进行过多扩展,而这些部分在现代C++中并没有太大用处. (6认同)
  • 你的帖子没有回答原始程序的错误. (4认同)
  • 弗拉德是对的.在Stack Overflow上,我们对程序提出疑问,并回答这些问题.建议另一种方法是一个很好的侧面评论,但你不是通过完全__ignoring他的问题来做OP的任何好处. (3认同)
  • @VladfromMoscow*如果作者不使用std;:字符串,那并不代表他的程序错误*当然; 没人否认.话虽这么说,正如我已在另一条评论帖中指出的那样,这个问题没有提到你应该在其中看到的内容.至于字符串文字指针......为什么?这意味着你必须引入另一种类型的变量到底是什么?一个`const std :: string`就可以了,保持接口带来的一切,就像在标准库算法中更容易使用一样. (2认同)
  • @thecoshman使用std :;在thius情况下的字符串是一个非常糟糕的解决方案.没有必要使用整个类std:;字符串来输出字符串文字.OP正在学习这门语言并且很明显(当然除了你)他现在正在学习字符数组,他的任务是管理正确的字符数组. (2认同)