0

下面是我得到的编译错误以及与 em 一起出现的 header/cpp 文件。如果有人有几分钟的时间和更好的眼睛来捕捉我无法捕捉到的东西,我会永远爱他们。这可以追溯到要测试的 a3main.cpp,因此,如果您还需要该文件的参考,请大声告诉我。再次感谢!

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);
};
4

4 回答 4

2

您需要从顶部开始,一一解决错误。

第一个错误是:

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);

您声明modeconst char*并且错误说作为strcpychar*的第一个参数。该错误表示转换const char*为无效char*。所以应该清楚,错误是你不能mode作为第一个参数传递给strcpy.

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


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

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

const char* disk::get mode() const你忘记了一个下划线。

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

于 2012-08-09T17:23:39.133 回答
0

您正在传递modestrcpyconst修饰符 onmode阻止内容被修改。除非在某处的头文件中定义,否则您还有几个拼写错误(modvs. mode) 。mod

于 2012-08-09T17:22:29.993 回答
0

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

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

segment* my_seg = new segment[num];

于 2012-08-09T17:25:40.113 回答
0

在第 12 行,您传递mode了 aconst char*作为 的第一个参数strcpy(),它需要 a char*strcpy()将修改指向的内存,因此您不能传递 const 指针。顺便说一句,这条线几乎肯定是错误的,你为什么要复制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
于 2012-08-09T17:32:18.820 回答