使用友元函数

时间:2017-06-27 06:38:14

标签: c++ function private protected

我必须制作一个节目,其中显示了孩子出生时的namesurnameyear。一切运作良好,friend函数除外,它必须访问private / protected变量birth_year并显示0,如果他的birth_year }大于2007,否则显示1

以下是代码:

#include <iostream>
#include <string.h>

using namespace std;

class child{
protected:

    char name[20],surname[20];
    int birth_year;
public:

    child(char*,char*,int);
    getyear();
    show();
    friend void itsolder();
};

child::child(char* n, char* p, int a)
{

    strcpy(name,n);
    strcpy(surname,p);
    birth_year=a;
}

child::getyear()
{

    return birth_year;
}

child::show()
{

    cout << "Name: " << name << endl;
    cout << "Surname: " << surname << endl;
    cout << "Year of birth: " << birth_year << endl;
}

void itsolder(child&year)
{

    if (year.birth_year>2007)
        cout << "0" << endl;
    else
        cout << "1" << endl;
}

int main()
{

    child c1("Richard", "John", 1997);
    c1.show();
    cout << c1.getyear() << endl;
    itsolder(c1.birth_year)
    return 0;
}

以下是错误:

  1. int child::birth_yearprotected;
  2. “在此上下文中” - 是我将条件放入friend函数以及我将其调用的位置main();
  3. 从类型child&
  4. 的表达式初始化int类型的引用无效

2 个答案:

答案 0 :(得分:2)

friend void itsolder();的声明与

的定义不符
void itsolder(child&year)
{
    if (year.birth_year>2007)
        cout << "0" << endl;
    else
        cout << "1" << endl;
}

将其更改为friend void itsolder(child&);并相应地传递参数:

itsolder(c1);

答案 1 :(得分:0)

我同意@StoryTeller在他的回答中写的内容,但除此之外,您的程序自C++11起无效。字符串文字的类型为const char[n],它会衰减为const char*,但默认情况下,g++clang++等编译器会出于向后兼容性的原因接受此代码。如果使用-pedantic-errors命令行选项,则会出现编译器错误。

除此之外,还缺少getyear()show()成员函数的返回类型。您必须明确指定每个函数的返回类型。

查看实时演示here。 观察编译器提供的警告:

g++ -O2 -std=c++11 -Wall -Wextra   main.cpp && ./a.out

main.cpp: In function 'int main()':

main.cpp:53:37: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

     child c1("Richard", "John", 1997);

                                     ^

main.cpp:53:37: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

所以你的正确代码应该是this