Ошибка переменной области при объявлении функции-друга - PullRequest
0 голосов
/ 12 сентября 2011

Функции друзей не могут получить доступ к переменным классов

У меня проблема с несколькими функциями друзей, которые не могут получить доступ к переменным в классах, где они были объявлены как друзья.

Фактический текст ошибки: error: 'fid' не был объявлен в этой области.это повторяется для других частных переменных.Та же ошибка дана для трех функций: чтение, отрицание и запись.

Пара замечаний: 1) Эта лабораторная работа требует, чтобы я написал код, чтобы функции могли использоваться обоими классами.

Я компилирую это в окнах с code :: blocksиспользуя g ++, и я также попытался скомпилировать свой код в ubuntu, используя g ++ из терминала, используя флаг -g, и я получаю одну и ту же ошибку оба раза.

Любые ваши предложения будут с благодарностью.

Заголовочный файл

#ifndef PXMUTILS_H
#define PXMUTILS_H

#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>

using namespace std;
typedef unsigned char uchar;

class pgm
{
public:
    pgm();
    ~pgm();
    void read(string &);
    void negative();
    void write(string);
    friend void read (const string &);
    friend void write(string);
    friend void negative();
private:
    int nr;
    int nc;
    int mval;
    int ftyp;
    string fid;
    uchar **img;
};

class ppm
{
public:
    ppm();
    ~ppm();
    void read(string &);
    void negative();
    void write(string);
    friend void read (const string &);
    friend void write (string);
    friend void negative ();
private:
    int nr;
    int nc;
    int mval;
    int ftyp;
    string fid;
    uchar **img;
};

#endif

Программа на C ++

#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include "pxmutils.h"

using namespace std;
typedef unsigned char uchar;

uchar ** newimg(int nr, int nc, int ftyp)
{
uchar **img=new uchar *[nr];
img[0]=new uchar [nr*nc*ftyp];
for(int i=1; i<nr; i++)
    {
        img[i]=img[i-1]+nc*ftyp;
    }
    return img;
}

void deleteimg(uchar **img)
{
    if(img)
    {
        if(img[0])
        {
            delete [] img[0];
        }
        delete [] img;
    }
}
void read (const string &fname)
{
    ifstream fin(fname.c_str(), ios::in);
    if(!fin.is_open())
    {
        cerr<<"Could not open "<<fname<<endl;
        exit(0);
    }
    fin >>fid
        >>nc
        >>nr
        >>mval;
        while (fin.get() != '\n') { /*skip to EOL */ }

    img=newimg(nr, nc);
    fin.read((char *)img[0], nr*nc);
    fin.close();
    }

void set_cmap(string mname)
{
}

void negative()
{
    for(int i=0; i<nr; i++)
    {
        for(int j=0; j<nc; j++)
        {
           int t=img[i][j];
           img[i][j]=(255-t);
        }
    }
}

void write(string fname)
{
        ofstream fout (fname.c_str(), ios::out);
        size_t dp;
    if ((dp = fname.rfind(".pgm")) != string::npos)
        {
            fout<<"P5"<<endl;
        }
        if((dp= fname.rfind(".ppm")) != string::npos)
        {
            fout<<"P6"<<endl;
        }
        fout<<nc<<" "<<nr<<endl;
        fout<<mval<<endl;

    for(int i=0; i <nr; i++)
    { 
        for (int j=0; j<nc; j++)
        {
            fout<<img[i][j]<<" ";
        }
        fout<<endl;
    }

    fout.close();
}

pgm::pgm()
{
    nr=0;
    nc=0;
    mval=0;
    ftyp=1;
    fid="";
    img=NULL;
}

pgm::~pgm()
{
    deleteimg(img);
}

ppm::ppm()
{
    nr=0;
    nc=0;
    mval=0;
    ftyp=1;
    fid="";
    img=NULL;
}

ppm::~ppm()
{
    deleteimg(img);
}

Программа для проверки функций

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

#include "pxmutils.h"

int main(int argc, char *argv[])
{
    if (argc == 1) {
        cerr << "No input file specified!\n";
        exit(0);
    }

    string fname = argv[1];
    size_t dp;

    if ((dp = fname.rfind(".pgm")) == string::npos) {
        cout << "PGM error: file suffix " << fname
             << " not recognized\n";
        exit(0);
    }

    fname.erase(dp);

pgm img_g;
    ppm img_c;

    img_g.read(fname+".pgm");

    if (argc == 3)    
    img_c.set_cmap(argv[2]);

    img_c = img_g;

    img_g.negative();

    img_g.write(fname+"_n.pgm");
    img_c.write(fname+"_c.ppm");
}

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011
fin >>fid
    >>nc
    >>nr
    >>mval;
    while (fin.get() != '\n') { /*skip to EOL */ }

В этом коде fid, nc, nr и т. Д. Не определены. Вам нужно использовать экземпляр класса, чтобы иметь к ним доступ, они не существуют сами по себе.

Ваши функции не принимают объекты класса в качестве параметров, так как вы собираетесь их читать?

0 голосов
/ 12 сентября 2011

Вам нужно немного вернуться к основам.Когда вы определяете нестатические члены класса, вы определяете атрибуты или операции объектов класса, но эти атрибуты не существуют сами по себе, только как частьэкземпляры класса.

Эта концепция ортогональна access и спецификаторам доступа , то есть это так, независимо от того, являются ли члены public, protected или private.Если у вас есть экземпляр, когда вы пытаетесь получить доступ к этим членам, в игру вступают спецификаторы доступа , и вот тут-то и вступает в игру дружба : он предоставит ваш код доступа членам, которыев противном случае был бы недоступен (private или protected вне иерархии наследования).

Проблема в вашем коде состоит в том, что у вас нет объекта, и, следовательно, вы не можете получить доступ к членам объекта.Вам нужно будет либо создать или передать объект соответствующего типа функциям.

В коде есть другие проблемы, например, распределение памяти внутри newimg выглядит несколько подозрительно (что быловы собираетесь выделить?) но это выходит за рамки этого вопроса.

0 голосов
/ 12 сентября 2011

Вы должны еще раз подумать о своем дизайне.Лучше по возможности избегать функций friend,

...