C++令人困惑的编译错误

C++ confusing compilation errors

本文关键字:编译 错误 C++      更新时间:2023-10-16

下面是我得到的编译错误和随它们一起使用的头文件/cpp文件。如果有人有几分钟的时间和更好的眼光来捕捉我无法捕捉到的东西,我会永远爱他们。这可以追溯到要测试的 a3main.cpp,所以如果你也需要该文件 fir 引用,请给我喊一声。再次感谢!

a3.cpp: In constructor 'disk::disk(int, const char*)': 
a3.cpp:12: error: invalid conversion from 'const char*' to 'char*' 
a3.cpp:12: error:   initializing argument 1 of 'char* strcpy(char*, const char*)' 
a3.cpp: In member function 'void disk::memory(int)': 
a3.cpp:26: error: expected unqualified-id before '=' token 
a3.cpp:28: error: expected primary-expression before '==' token 
a3.cpp: At global scope: 
a3.cpp:37: error: expected initializer before 'mode' 
a3.cpp:42: error: expected initializer before '*' token 
a3.cpp:47: error: expected initializer before 'get_segment'

//a3.cpp
#include <iostream>
#include "disk.h"
#include <iomanip>
#include <cstring>
#include <stdlib.h>
using namespace std;
disk::disk(int num_of_segments, const char* mode)
{
    memory(num_of_segments);
    if(strcmp(mode, "w") || !strcmp(mode, "a"))
        strcpy(mode, mode);
    else
        strcpy(mod, "w");
}   
disk::disk()
{
    memory(20);
    strcpy(mod, "w");
}
void disk::memory(int num)          //private, see header file
{
    segment = new segment[num];
// (nothrow) - page 80 in the text
    if(segment == NULL)
    {
        cerr << "Could not find any data in class ";
        exit(0);
    }
    total = num;
    count = 0;
}
const char* disk::get mode() const
{
    return mode;
}
segment segment* disk::get_all_segment() const
{
    return sgmt;
}
int disk::segment get_segment(int pos) const
{
    segment temp;
    if(pos > 0 && pos < count)
    {
        temp = segment[pos];
    }
    return temp;
}
int disk::get_segment_count() const
{
    return count;
}
disk disk::operator+=(const segment &r)
{
    if(count < total)
    {
        sgmt[count] = r;
        count++;
    }
    return *this;
}
void disk::operator=(const disk &r)
{
    if(*this != &r)
    {
        if(sgmt != NULL)
            delete[] sgmt;
        memory(r.total);
        for(int i=0; i < r.count; i++)
        {
            sgmt[i] = r.sgmt[i];
        }
        count = r.count;
        strcpy(mod, r.mod);
    }
}   
disk::disk(const disk& copy)            //copy constructor
{
    memory(copy.total);
    for(int i=0; i<copy.count; i++)
    {
        sgmt[i] = copy.sgmt[i];
    }
    count = copy.count;
    strcpy(mod, copy.mod);
}
disk::~disk()
{
    if(*sgmt != NULL)
    {
        delete[] sgmt;
    }
}
//disk.h
#include "segment.h"
#include <iomanip>
#include <cstring> class disk {
    private:
        segment *sgmt;
        char mod[3];
        int count, total;
        void memory(int);
    public:
        disk(int, const char *);
        disk( );
        const char* get_mode( ) const;
        segment get_segment(int) const;
        int get_segment_count( ) const;
        const segment* get_all_segments( ) const;
        int access(const char [ ]);
        disk operator+=(const segment &);
        void operator=(const disk &);
        disk(const disk &);
        ~disk( ); };
//segment.h
class segment
{
    private:
        char data[SIZE][41];
    public:
        void initialize(const char [][2000], int);
        void initialize();
        int match(const char []);
        void sort();
        void get_word(char [], int);
        int set_word(const char [], int);
        int set_char(int, int, char);
        char get_char(int, int);
};

您需要从顶部开始逐个解决错误。

第一个错误是:

a3.cpp:12: error: invalid conversion from 'const char*' to 'char*' 
a3.cpp:12: error:   initializing argument 1 of 'char* strcpy(char*, const char*)'

引用的第 12 行是:

strcpy(mode, mode);

您将mode声明为 const char*,并且错误显示strcpychar*作为其第一个参数。该错误说它无效,无法将const char*转换为char*。所以应该清楚的是,错误是不允许将mode作为第一个参数传递给strcpy

strcpy(mode, mode);没有意义,也是不允许的。 mode无法修改,但 strcpy 会修改它。此外,您正在尝试将其复制在自身之上,如果它有效,将无济于事。


AndreyT在最后这些错误上是对的;你必须学会回去重新阅读他们指向的代码,看看你做错了什么。

segement in segment = new segment[num]; 是一个类型名称,在这种情况下,您不能像这样分配给它,也不能像 if(segment == NULL) 中那样获取其值。你可能的意思是sgmt.

const char* disk::get mode() const中,您忘记了下划线。

segment segment* disk::get_all_segment() constint disk::segment get_segment(int pos) const你有一个额外的segment s。

您正在将mode传递给strcpymode上的const修饰符阻止修改内容。 您也有几个错别字(mod vs. mode ),除非mod在头文件中的某处定义。

strcpy的第一个参数(模式)应该是类型 char* ,而不是const char*

segment = new segment[num];无效,因为segment是一种类型。您需要为特定段命名。尝试类似操作:

segment* my_seg = new segment[num];

在第 12 行传递 mode ,这是一个const char*作为 strcpy() 的第一个参数,它期望一个char*strcpy()将修改指向的内存,因此您无法传递常量指针。顺便说一句,这条线几乎肯定是错误的,你为什么要mode复制到它本身?这是没有手术的。你可能的意思是strcpy(mod, mode).

在第 26 行和第 28 行,使用 segment 作为变量,但它是类型 ( class segment )。你可能的意思是sgmt.

在第 37 行,您写了 get mode()(带空格)而不是get_mode()(带下划线 _)。

在第 42 行,您写了 segment segment* disk::get_all_segment() const 而不是 const segment* disk::get_all_segment() const .

在第 47 行,您写了int disk::segment get_segment(int pos) const.应该是segment disk::get_segment(int pos) const.

通常,签名是

returned_value class_name::function_name(parameters) const