Как правильно обращаться с функциями друзей? - PullRequest
0 голосов
/ 04 апреля 2019

Ниже приведен класс String, который я создал с помощью конструктора и конструктора копирования.Я объявил класс M, который содержит функцию void print(String s);, затем попытался сделать функцию print класса M как друга класса String, но он выдает ошибку времени компиляции, говоря, что M не существует.С другой стороны, если я сделаю класс M другом класса String, то на удивление код сработает.

#include<iostream>
#include<cstring>
using namespace std;
class String{
private:
    char* str;
    size_t len;
public:
    String(char* str){
        len=sizeof(str)/sizeof(char);
        this->str=new char[(int)len];
        strcpy(this->str,str);
    }
    String(const String& s){
        if(str!=s.str)
        {
            strcpy(str,s.str);
            len=s.len;
        }
    }
    friend void M::print(String);//This line gives compile time error saying M does not exists.
    // friend class M;//This line on the other hand works completely fine when uncommented
};
class M{
public:
    void print(String s){
        cout<<s.str;
    }
};
int main()
{
    char x[6]={'H','e','l','l','o','\0'};
    String str=x;
    M a;
    a.print(str);
    return 0;
}

1 Ответ

2 голосов
/ 04 апреля 2019

С ++ поведение довольно противоречиво в этом вопросе.Создание класса M другом было бы равносильно объявлению этого класса форвардом.Однако для создания метода этого класса друг потребует определения этого класса:

class String;

class M{
public:
    void print(String s);
};

class String { 
 // definition goes here...
  friend void M::print(String); // now works because compiler is aware of M::print
};

void M::print(String s)
{
   cout<<s.str;
}
...