C++之友元函数不能访问类的私有成员

无法解决的问题:类中声明,类外定义的成员函数,导致无法访问类中的私有成员函数

去掉using namespace std;  改变#include <iostream>啥的都没用

苍了个天,走过路过的帮个忙?

真的是头大,跟着视频敲代码,人家的代码好好的,就我的出错。本来出现红色波浪线就不舒服,但好在能编译通过,但是,在类中的函数声明和定义分离的时候,编译就不通过,成员函数就无法访问私有成员了,就拿出来了而已啊,前缀该加的都加了,视频里好好的能通过,我咋就不能了?嗯?

学C++吗,令人头秃的那种,呵呵

#include <iostream>
using namespace std;

template <typename T>
class Complex
{
    Complex(T a, T b);
    void printCom();
    friend Complex MySub(Complex &c1, Complex &c2)
    {
	Complex tmp(c1.a - c2.a, c1.b - c2.b);
	return tmp;
    }
    friend ostream & operator<<(ostream &out, Complex &c3)
    {
	cout << c3.a << " + " << c3.b << "i" << endl;
	return cout;
    }
public:
    Complex operator+(Complex &c2)
    {
	Complex tmp(a + c2.a, b + c2.b);
	return tmp;
    }
private:
    T	a;
    T	b;
};

// 构造函数写在了类的外部
template <typename T>
Complex<T>::Complex(T a, T b)    // 类的函数,需要加域名
{
    this->a = a;
    this->b = b;
}

template <typename T>
Complex<T>::printCom()
{
    cout << "a: " << a << ", b: " << b << endl;
}

void main()
{
    Complex<int> c1(1, 2);
    Complex<int> c2(3, 4);

    Complex<int> c3 = c1 + c2;

    cout << c3 << endl;
    
    // 滥用友元函数
    {
	Complex<int> c4 = MySub(c1, c2);
	cout << c4 << endl;
    }
    

    system("pause");
    return;
}

 代码中,将类的构造函数在类中进行声明后放到类的外部进行定义,但是有了以下一个让我呵呵的错误

 error C2248: “Complex<T>::Complex”: 无法访问 private 成员(在“Complex<T>”类中声明)

咋?你自己的类成员函数还不能访问啦?那要你这成员变量有什么用,可以吃吗?又不能对其进行赋值,视频里都成功1个,我就失败1个,瞧不起人呗?友元函数定义在类里面还是不能访问类的私有成员,体现自己封装性很好?这破坏封装性的函数我不用也罢了,可是不能对成员变量进行赋值是什么骚操作?

 我对int类型的类 c1 c2赋值怎么就不能够了?

#include <iostream>
using namespace std;

template <typename T>
class Complex
{
    friend Complex MySub(Complex &c1, Complex &c2)
    {
	Complex tmp(c1.a-c2.a, c1.b-c2.b);
	return tmp;
    }
    friend ostream & operator<<(ostream &out, Complex &c3)
    {
	cout << c3.a << " + " << c3.b << "i" << endl;
	return cout;
    }
public:
    Complex(T a, T b)
    {
	this->a = a;
	this->b = b;
    }
    void printCom()
    {
	cout << "a: " << a << "b: " << endl;
    }
    Complex operator+(Complex &c2)
    {
	Complex tmp(a + c2.a, b + c2.b);
	return tmp;
    }

private:
    T	a;
    T	b;
};

// 运算符重载的正规写法
// 重载 << >> 只能用友元函数, 其他的运算符重载都要写成成员函数,不要滥用友元函数

/*
ostream &operator<<(ostream &out, Complex &c3)
{
    out << "a: " << c3.a << ", b: " << c3.b << endl;
    return out;
}
*/

void main()
{
    Complex<int> c1(1, 2);
    Complex<int> c2(3, 4);

    Complex<int> c3 = c1 + c2;

    cout << c3 << endl;
    
    // 滥用友元函数
    {
	Complex<int> c4 = MySub(c1, c2);
	cout << c4 << endl;
    }
    

    system("pause");
    return;
}

把构造函数放在类中,虽然会有红色波浪线警告,但是编译能通过,可以进行打印。拿出来就不能,视频中的人是怎么做到的?版本问题?2010 vs 2008?

 走过路过的朋友帮个忙?

 


版权声明:本文为qq_39647753原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。