C++ 从C+中的其他方法调用构造函数+;

C++ 从C+中的其他方法调用构造函数+;,c++,constructor,C++,Constructor,我不确定这在C++中是否合法: class Image { Image(int w, int h) // constructor { ... } Image GetSpecialImage() { Image rVal(10,10); return rVal; } } 我需要使用另一个中间级别()(代码>方法来在C++中执行吗?如果是,你能告诉我怎么做吗 EDIT:尽

我不确定这在C++中是否合法:

class Image
{
     Image(int w, int h) // constructor
     {
            ...
     }

     Image GetSpecialImage()
     {
          Image rVal(10,10);
          return rVal;
     }
}

我需要使用另一个中间级别<代码>()(<)>代码>方法来在C++中执行吗?如果是,你能告诉我怎么做吗


EDIT:
尽管你说它很好,但它并没有真正做到我想做的事情。。。让我再给你一些代码:

class Image
{
     float* data;
     int w;
     int h;

     Image(int w, int h) // constructor
     {
            this->w = w;
            this->h = h;
            data = (float*) malloc ( w * h * sizeof(float) );
     }

     Image GetSpecialImage()
     {
          Image rVal(this->w,this->h);

          for(i=0;i<this->w * this->h;i++)
          {
                rVal.data[i] = this->data[i] + 1;
          }

          return rVal;
     }
}

int main()
{
      Image temp(100, 100);
      Image result = temp.GetSpecialImage();
      cout<<result.data[0];

      return 0;
}
类图像
{
浮动*数据;
int w;
int-h;
Image(intw,inth)//构造函数
{
这->w=w;
这->h=h;
数据=(float*)malloc(w*h*sizeof(float));
}
图像GetSpecialImage()
{
图像rVal(此->w,此->h);
对于(i=0;iw*this->h;i++)
{
rVal.data[i]=此->数据[i]+1;
}
返回rVal;
}
}
int main()
{
图像温度(100100);
图像结果=temp.GetSpecialImage();

正如赛斯所说,这是合法的

为了使其更好地工作,您可以对其进行更改,使
GetSpecialImage
成为一个静态函数。在类中定义的静态函数是一个类函数,而不是一个对象函数。这意味着您不需要对象来调用它


然后它将被这样调用:
Image special=Image::GetSpecialImage();

正如赛斯所说,这是合法的

为了使其更好地工作,您可以对其进行更改,使
GetSpecialImage
成为一个静态函数。在类中定义的静态函数是一个类函数,而不是一个对象函数。这意味着您不需要对象来调用它


然后会这样调用它:
Image special=Image::GetSpecialImage();

是的,你可以这样做。不过我会这样做

 Image GetSpecialImage()
 {            
     return Image(10,10);      
 } 

是的,你能做到。不过我会做到的

 Image GetSpecialImage()
 {            
     return Image(10,10);      
 } 

虽然这段代码没有什么问题(除了返回一个本地,这是一个no-no),但我猜您要寻找的是一个静态构造函数模式。如下所示:

class Image{
 public:
  static Image* GetSpecialImage(){
    return new Image(10,10);
  }
};

//and call it so
Image *i = Image::GetSpecialImage();

虽然这段代码没有什么问题(除了返回一个本地,这是一个no-no),但我猜您要寻找的是一个静态构造函数模式。如下所示:

class Image{
 public:
  static Image* GetSpecialImage(){
    return new Image(10,10);
  }
};

//and call it so
Image *i = Image::GetSpecialImage();


是的,这是完全合法的。@SethCarnegie:谢谢你的回答。请参阅这里的
Factory Method Pattern
:阅读你的编辑,出了什么问题?是不是给出了错误的值?在修复了各种编译错误之后(你确定这正是你正在调试的代码吗?),我得到了你想要的结果。(gdb)p临时数据[0]$1=0(gdb)p结果数据[0]$2=1您是在启用还是禁用优化的情况下进行测试?我建议使用memset初始化浮点数组并使用调试器进行步进。是的,这是完全合法的。@SethCarnegie:谢谢您的回答。请参阅
Factory Method Pattern
此处:阅读您的编辑,出了什么问题?是不是给出了错误的值?在修复各种编译错误(您确定这正是您正在调试的代码吗?),我得到的正是您所期望的。(gdb)p temp.data[0]$1=0(gdb)p result.data[0]$2=1您是在启用还是禁用优化的情况下进行测试?我建议使用memset初始化浮点数组并使用调试器进行步进。按值返回局部变量完全可以。如果它返回的是错误的引用。按值返回变量是合法的,但在执行此操作之前应小心。它会调用副本构造函数,在图像的情况下,它可能会很长并暂时增加所需的内存。但是,许多编译器会通过使用void GetSpatialImate(image&outImage)等引用参数进行返回来对此进行优化。但是现在您遇到了一个资源管理问题。客户端代码需要知道库代码如何分配
映像
资源,并适当地解除分配它。如果您必须动态分配
映像
,则最好将资源封装在一个智能指针中,该指针封装了所需的解除分配mechanis@J_D“按值返回变量…调用复制构造函数…”。除非它不是。请参阅。按值返回局部变量是完全正确的。如果它返回的引用不正确。虽然按值返回变量是合法的,但在执行此操作之前应小心。它调用复制构造函数,在图像的情况下,此构造函数可能会很长,并且会临时增加然而,许多编译器会通过使用void GetSpatialImate(Image&outImage)等引用参数进行返回来优化这一点。但是现在您遇到了一个资源管理问题。客户端代码需要知道库代码如何分配
映像
资源,并适当地解除分配它。如果您必须动态分配
映像
,则最好将资源封装在一个智能指针中,该指针封装了所需的解除分配mechanis.@J_D“按值返回变量…调用复制构造函数…”。除非它不这样做,如OP的情况。请参阅。