C++ 的 error C2040:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 的 error C2040:相关的知识,希望对你有一定的参考价值。

error C2040: 'private: static char * Student::name' : 'char' differs in levels of indirection from 'char [20]'
贴上代码:
//example4_02.cpp:静态成员函数访问静态数据成员示例
#include <iostream>
using namespace std;
class Student

private:
int num;
static int total; //私有的静态数据成员
static char name[20]; //私有的静态数据成员
public:
Student( ) total++; //构造函数,每定义一个新对象,则total加1(不赋初值时转到这里的total++)
~Student( ) total--; //析构函数,每一个对象生命期结束,则total减1
Student( int n, char *p );
int Getnum( );
static char* GetName( ); //声明一个公有静态成员函数
static void Print( ); //声明一个公有静态成员函数
;
int Student::total=0; //静态数据成员的初始化 为什么这样定义 字面意思理解类中只有一个total 所以Student::total
char Student::name = "wang";
Student::Student(int n, char *p) //带参构造函数,每定义一个新对象,则total加1

num=n;
strcpy(name,p);
total++;

char* Student::GetName( ) //定义该公有静态成员函数,此处不能再加static
// cout<<name;
return name;

int Student::Getnum( )
return num;

void Student::Print( ) //定义该公有静态成员函数,此处不能再加static

cout<<"The number of all students: "<<total<<endl;

int main()

Student::Print(); //无对象时可类名::静态成员函数名()输出total
Student *p=new Student(13,"Wang"); //用指针申请动态空间并得到对象*p
cout<<"Student num:"<<p->Getnum()<<" Student Name:"<<p->GetName()<<endl;
Student::Print(); //用类名::静态成员函数名()输出total
p->Print(); //用指针所指向的对象去访问静态成员函数名()
delete p; //通过指针删除动态对象,析构一次
Student::Print(); //用类名::静态成员函数名()输出total
Student s[2]; //定义两个对象,构造函数调用两次
Student::Print(); //这两行输出结果一定相同
s[0].Print();
s[1].Print();
return 0;


如果删掉char Student::name = "wang";这行到是可以,不过又会有新的bug,怎么改,求教?

参考技术A

    像前面那位朋友说的

    char Student::name[20] = "wang";

    加上头文件

    #include <cstring>

参考技术B char Student::name[20] = "wang";本回答被提问者采纳

C++文档阅读笔记-How to find Segmentation Error in C & C++ ? (Using GDB)

Segmentation Error:是在运行时对内存非法访问时报的错,比如非法读取内存。

这种报错在C/C++程序中很常见。

在下面这个例子中展示了如何在程序中找段错误,找到这个段错误是在程序代码的哪一行。

注意:这里使用的是Linux的Ubuntu操作系统演示。

首先编写如下代码:

// Segmentation Error Demonstration
// Author - Rohan Prasad
#include <iostream>
using namespace std;
  
int main()

    int* p = NULL;
  
    // This lines cause the segmentation 
    // error because of accessing the 
    // unknown memory location.
    *p = 1;
   
    cout << *p;
    return 0;

如何使用GDB找到错误源

将上面的这个文件保存为Program1.cpp。打开终端,进入Program1.cpp所在目录

①编译

$ gcc -g Program1.cpp (in my case).

②运行

$ ./a.out (it is Object File)

这里会报出错,异常原因是段错误

Segmentation fault (core dumped)

③使用gdb调试程序

$ gdb ./a.out core

使用这条命令后会有如下输出:

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
/home/logarithm/Desktop/Test Case/Miccl/core: No such file or directory.
(gdb)

这里键盘输入r,并且按下回车键

(gdb) r
Starting program: /home/logarithm/Desktop/Test Case/Miccl/a.out

Program received signal SIGSEGV, Segmentation fault.
0x00005555555547de in main () at Sege.cpp:8
8 *p=1;
(gdb)

现在就可以知道端错误在第8行*p = 1这个地方,这里输入quit就能退出了。

(gdb) quit
A debugging session is active.

Inferior 1 [process 3617] will be killed.

Quit anyway? (y or n) y

以上是关于C++ 的 error C2040:的主要内容,如果未能解决你的问题,请参考以下文章

这个 C++ 错误 std::length_error 是啥意思

vscode编写c++无法显示errors

delphi 中 raise exception.create(Error) 怎么翻译成C++ 语言?

如何使用 #error 指令 - C++

C++报错:error C3874

致命错误 C1189:#error:core.hpp 标头必须编译为 C++