无法解决的问题:类中声明,类外定义的成员函数,导致无法访问类中的私有成员函数
去掉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版权协议,转载请附上原文出处链接和本声明。