C++ 从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:尽
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的情况。请参阅。