2345678910111213141516171819 class Grade; class Grade { Grade *p; Grade &r; public: // Grade():p(new Grade),r(*p) //不可以 // Grade():p(NULL),r(*p) //可以 Grade():p(this),r(*p) //可以 { } }; int main() { Grade::Grade(); cout<<sizeof(Grade)<<endl; // return 0; }
原帖: http://bbs.csdn.net/topics/390287096?page=1#post-39297144892971448
18 个解决方案
#1
重发代码:
2345678910111213141516171819 class Grade; class Grade { Grade *p; Grade &r; public: // Grade():p(new Grade),r(*p) //不可以 // Grade():p(NULL),r(*p) //可以 Grade():p(this),r(*p) //可以 { } }; int main() { Grade::Grade(); cout<<sizeof(Grade)<<endl; // return 0; }
#2
2345678910111213141516171819 class Grade; class Grade { Grade *p; Grade &r; public: // Grade():p(new Grade),r(*p) //不可以 // Grade():p(NULL),r(*p) //可以 Grade():p(this),r(*p) //可以 { } }; int main() { Grade::Grade(); cout<<sizeof(Grade)<<endl; // return 0; }
#3
你这代码发的
#4
我错了。。。。
#5
想自杀了。。。。
#6
class Grade;
class Grade {
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) //不可以
// Grade():p(NULL),r(*p) //可以
Grade():p(this),r(*p) //可以
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade();
cout<<sizeof(Grade)<<endl; //
return 0;
}
这个地方的 Grade::Grade();这样也不报错
#7
Grade::Grade();
这样子我真没用过,等楼下大侠解答
这样子我真没用过,等楼下大侠解答
#8
class Grade {
int tmpa;
char tmpb;
public:
Grade()
{
tmpa = 0;
tmpb = 'a';
cout<<"no canshu constructing ..."<<endl;
}
Grade(int a,char b)
{
tmpa = a;
tmpb = b;
cout<<"have canshu constructing ..."<<endl;
}
int show()
{
cout<<"all is well"<<endl;
}
};
int main()
{
// Grade tmp;
Grade::Grade();
// Grade::show(); //成员函数不能这么调用
return 0;
}
#9
上个贴结了,拿了分没
#10
拿了10分
#11
你得实例化一个类的对象才能调用非静态函数啊
解决办法2个
1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.
2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();
解决办法2个
1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.
2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();
#12
是这个问题 : 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间
class Grade;
class Grade
{
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) //不可以
// Grade():p(NULL),r(*p) //可以
Grade():p(this),r(*p) //可以
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade();
cout<<sizeof(Grade)<<endl; //
return 0;
}
#13
#include <iostream>
using namespace std;
class Grade
{
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) // fine
// Grade():p(NULL),r(*p) // bad, initialization of r causes UB
Grade():p(this),r(*p) // fine
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade(); // error. incompetent compilers allow this.
cout<<sizeof(Grade)<<endl;
return 0;
}
#14
难道和编译器相关,我是调试过的呀!看你写的也应该是调试过的。
#15
成员函数是可以的, 但是如果是构造函数的话, 就要注意 循环递归了.
// Grade():p(new Grade),r(*p) //不可以
改成
Grade(): r(*p)
{
p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}
如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.
// Grade():p(new Grade),r(*p) //不可以
改成
Grade(): r(*p)
{
p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}
如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.
#16
不好意思,这个一犯懒真没调试,是我错了,Grade():p(new Grade),r(*p) 导致无限递归,不行。#14 其他的注释都没问题了。
#17
LZ 如果很需要 p 在构造函数中指向另一个同类对象的指针,可以想下面这样试试。
不过我个人觉得这种写法很难看,也不好。
不知道楼主到底要解决什么样的问题。
#include <iostream>
using namespace std;
class Grade
{
Grade *p;
Grade &r;
struct delegate_t { };
Grade(delegate_t):p(this),r(*this) { }
public:
Grade():p(new Grade (delegate_t())),r(*p) { }
};
int main()
{
Grade g;
return 0;
}
不过我个人觉得这种写法很难看,也不好。
不知道楼主到底要解决什么样的问题。
#18
就是这问题了,把正在定义的类类型的指针的赋值(new 类名)语句写在成员函数中就可以。
#1
重发代码:
2345678910111213141516171819 class Grade; class Grade { Grade *p; Grade &r; public: // Grade():p(new Grade),r(*p) //不可以 // Grade():p(NULL),r(*p) //可以 Grade():p(this),r(*p) //可以 { } }; int main() { Grade::Grade(); cout<<sizeof(Grade)<<endl; // return 0; }
#2
2345678910111213141516171819 class Grade; class Grade { Grade *p; Grade &r; public: // Grade():p(new Grade),r(*p) //不可以 // Grade():p(NULL),r(*p) //可以 Grade():p(this),r(*p) //可以 { } }; int main() { Grade::Grade(); cout<<sizeof(Grade)<<endl; // return 0; }
#3
你这代码发的
#4
我错了。。。。
#5
想自杀了。。。。
#6
class Grade;
class Grade {
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) //不可以
// Grade():p(NULL),r(*p) //可以
Grade():p(this),r(*p) //可以
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade();
cout<<sizeof(Grade)<<endl; //
return 0;
}
这个地方的 Grade::Grade();这样也不报错
#7
Grade::Grade();
这样子我真没用过,等楼下大侠解答
这样子我真没用过,等楼下大侠解答
#8
class Grade {
int tmpa;
char tmpb;
public:
Grade()
{
tmpa = 0;
tmpb = 'a';
cout<<"no canshu constructing ..."<<endl;
}
Grade(int a,char b)
{
tmpa = a;
tmpb = b;
cout<<"have canshu constructing ..."<<endl;
}
int show()
{
cout<<"all is well"<<endl;
}
};
int main()
{
// Grade tmp;
Grade::Grade();
// Grade::show(); //成员函数不能这么调用
return 0;
}
#9
上个贴结了,拿了分没
#10
拿了10分
#11
你得实例化一个类的对象才能调用非静态函数啊
解决办法2个
1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.
2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();
解决办法2个
1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.
2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();
#12
是这个问题 : 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间
class Grade;
class Grade
{
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) //不可以
// Grade():p(NULL),r(*p) //可以
Grade():p(this),r(*p) //可以
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade();
cout<<sizeof(Grade)<<endl; //
return 0;
}
#13
#include <iostream>
using namespace std;
class Grade
{
Grade *p;
Grade &r;
public:
// Grade():p(new Grade),r(*p) // fine
// Grade():p(NULL),r(*p) // bad, initialization of r causes UB
Grade():p(this),r(*p) // fine
{
cout<<"constructing..."<<endl;
}
};
int main()
{
Grade::Grade(); // error. incompetent compilers allow this.
cout<<sizeof(Grade)<<endl;
return 0;
}
#14
难道和编译器相关,我是调试过的呀!看你写的也应该是调试过的。
#15
成员函数是可以的, 但是如果是构造函数的话, 就要注意 循环递归了.
// Grade():p(new Grade),r(*p) //不可以
改成
Grade(): r(*p)
{
p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}
如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.
// Grade():p(new Grade),r(*p) //不可以
改成
Grade(): r(*p)
{
p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}
如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.
#16
不好意思,这个一犯懒真没调试,是我错了,Grade():p(new Grade),r(*p) 导致无限递归,不行。#14 其他的注释都没问题了。
#17
LZ 如果很需要 p 在构造函数中指向另一个同类对象的指针,可以想下面这样试试。
不过我个人觉得这种写法很难看,也不好。
不知道楼主到底要解决什么样的问题。
#include <iostream>
using namespace std;
class Grade
{
Grade *p;
Grade &r;
struct delegate_t { };
Grade(delegate_t):p(this),r(*this) { }
public:
Grade():p(new Grade (delegate_t())),r(*p) { }
};
int main()
{
Grade g;
return 0;
}
不过我个人觉得这种写法很难看,也不好。
不知道楼主到底要解决什么样的问题。
#18
就是这问题了,把正在定义的类类型的指针的赋值(new 类名)语句写在成员函数中就可以。