C ++混淆编译错误

时间:2012-08-09 17:16:48

标签: c++

下面是我得到的编译错误以及与em一起使用的header / 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);
};

4 个答案:

答案 0 :(得分: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);

您将mode声明为const char*,错误说strcpychar*作为其第一个参数。该错误表示将const char*转换为char*无效。因此,应该清楚的是,错误是您不允许将mode作为strcpy的第一个参数传递。

strcpy(mode, mode);毫无意义,不允许。 mode无法修改,但strcpy会修改它。此外,您正试图将其复制到自身,如果有效,则无效。


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

segement中的{p> 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个。{/ p>

答案 1 :(得分:0)

您正在将mode传递给strcpy,但const上的mode修饰符会阻止修改内容。您还有几个拼写错误(modmode),除非在某个头文件中定义了mod

答案 2 :(得分:0)

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

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

segment* my_seg = new segment[num];

答案 3 :(得分:0)

在第12行,您传递modeconst char*作为strcpy()的第一个参数,需要char*strcpy()将修改指向的内存,因此您无法传递const指针。顺便说一下这条线几乎肯定是错的,你为什么要把mode复制到自己身上?这是一次无操作。你可能意味着strcpy(mod, mode)

在第26和28行,您使用segment作为变量,但它是一种类型(class segment)。你可能意味着sgmt

在第37行,你写了get mode() space )而不是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