正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

时间:2022-01-01 20:39:27

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


引用 2 楼 gourideriben 的回复:
C/C++ code?12345678910111213141516171819 class Grade;   class Grade {       Grade  *p;        Grade   &amp;r;    public:       //   Grade():p(new Grade),r(*p)   //不可以 //   Grade():p(NULL)……


你这代码发的 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#4


我错了。。。。 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#5


引用 4 楼 gourideriben 的回复:
我错了。。。。

想自杀了。。。。

#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();这样也不报错 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#7


Grade::Grade();
这样子我真没用过,等楼下大侠解答 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#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


引用 7 楼 anhuizhuanjiao 的回复:
Grade::Grade();
这样子我真没用过,等楼下大侠解答

上个贴结了,拿了分没 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#10


引用 9 楼 gourideriben 的回复:
引用 7 楼 anhuizhuanjiao 的回复:Grade::Grade();
这样子我真没用过,等楼下大侠解答
上个贴结了,拿了分没

拿了10分 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#11


你得实例化一个类的对象才能调用非静态函数啊
解决办法2个

1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.

2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();

#12


引用 11 楼 libralibra 的回复:
你得实例化一个类的对象才能调用非静态函数啊
解决办法2个

1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.

2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();

是这个问题 :   正在定义的类中 成员函数能否用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


引用 13 楼 ri_aje 的回复:
C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;r;  public:  //   Grade():p(new Grade),r(*p)   // fine  //  ……

难道和编译器相关,我是调试过的呀!看你写的也应该是调试过的。

#15


成员函数是可以的, 但是如果是构造函数的话, 就要注意 循环递归了.

 //   Grade():p(new Grade),r(*p)   //不可以

改成
Grade(): r(*p)
{
   p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}

如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.

#16


引用 14 楼 gourideriben 的回复:
引用 13 楼 ri_aje 的回复:C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;amp;r;  public:  //   Grade(……

不好意思,这个一犯懒真没调试,是我错了,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


引用 16 楼 ri_aje 的回复:
引用 14 楼 gourideriben 的回复:
引用 13 楼 ri_aje 的回复:C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;amp;amp;r;  pu……

就是这问题了,把正在定义的类类型的指针的赋值(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


引用 2 楼 gourideriben 的回复:
C/C++ code?12345678910111213141516171819 class Grade;   class Grade {       Grade  *p;        Grade   &amp;r;    public:       //   Grade():p(new Grade),r(*p)   //不可以 //   Grade():p(NULL)……


你这代码发的 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#4


我错了。。。。 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#5


引用 4 楼 gourideriben 的回复:
我错了。。。。

想自杀了。。。。

#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();这样也不报错 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#7


Grade::Grade();
这样子我真没用过,等楼下大侠解答 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#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


引用 7 楼 anhuizhuanjiao 的回复:
Grade::Grade();
这样子我真没用过,等楼下大侠解答

上个贴结了,拿了分没 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#10


引用 9 楼 gourideriben 的回复:
引用 7 楼 anhuizhuanjiao 的回复:Grade::Grade();
这样子我真没用过,等楼下大侠解答
上个贴结了,拿了分没

拿了10分 正在定义的类中 成员函数能否用new 为该类类型的指针申请空间

#11


你得实例化一个类的对象才能调用非静态函数啊
解决办法2个

1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.

2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();

#12


引用 11 楼 libralibra 的回复:
你得实例化一个类的对象才能调用非静态函数啊
解决办法2个

1.定义show为static int show()并且返回一个数,要么就static void show()不用返回
这时,可以直接Grade::show()调用,因为是静态函数.

2.要么在main中实例化一个对象,
Grade a = Grade();
a.show();

是这个问题 :   正在定义的类中 成员函数能否用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


引用 13 楼 ri_aje 的回复:
C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;r;  public:  //   Grade():p(new Grade),r(*p)   // fine  //  ……

难道和编译器相关,我是调试过的呀!看你写的也应该是调试过的。

#15


成员函数是可以的, 但是如果是构造函数的话, 就要注意 循环递归了.

 //   Grade():p(new Grade),r(*p)   //不可以

改成
Grade(): r(*p)
{
   p = new Grade; //虽然语法上可以了, 但是会循环递归, 至于Why, 应该很好理解的.
}

如果是其它成员函数, 那就完全没有问题了.
设计模式中的 单例模式 就需要创建一个这样的指针,并且是唯一的.

#16


引用 14 楼 gourideriben 的回复:
引用 13 楼 ri_aje 的回复:C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;amp;r;  public:  //   Grade(……

不好意思,这个一犯懒真没调试,是我错了,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


引用 16 楼 ri_aje 的回复:
引用 14 楼 gourideriben 的回复:
引用 13 楼 ri_aje 的回复:C/C++ code?



12345678910111213141516171819202122

#include <iostream> using namespace std;   class Grade {  Grade  *p;  Grade  &amp;amp;amp;r;  pu……

就是这问题了,把正在定义的类类型的指针的赋值(new 类名)语句写在成员函数中就可以。