我有一个类Image,我需要返回这个类的实例。什么是简化方法呢?我是一名java程序员并且“返回这个”给我一个错误。
#include <string>
#include "AEEImage.h"
using namespace std;
IImage *image;
Image *img;
Image::Image()
{
image = new IImage();
}
Image::~Image()
{
delete image;
image = NULL;
}
Image *createImage(string str)
{
return /*return instance of this class*/;
}
这是Image的定义:
#pragma once
#include <string>
using namespace std;
class Image
{
public:
Image();
~Image();
Image createImage(string str);
Image createImage(const Image *img, int x, int y, int with, int height, int transform);
Image createImage(istream is);
};
我必须在C ++中编写类似于JAVA ME中的Image类(link): - 同名的班级(图片) - 方法名称,参数类型和返回类型
答案 0 :(得分:8)
this
仅适用于非静态成员函数;它们在一个对象上调用,this
指向该对象。 createImage()
是非会员职能;它没有在一个对象上调用,因此没有this
指针。
据推测,它应该创建一个图像并返回指向它的指针。也许你想要:
return new Image;
请记住,一旦不再需要该对象,调用者就有delete
对该对象的责任 - 在C ++中没有垃圾收集。你应该明智地学习RAII来学习如何在C ++中自动管理动态对象;特别是,智能指针可以解决这个问题:
std::unique_ptr<Image> createImage() {
return std::unique_ptr<Image>(new Image);
}
一般来说,你应该忘记你在Java中学到的任何习语,因为那是一种非常不同的语言。 C ++上有many good books。
您还应该避免使用全局变量,尤其是对于逻辑上属于类实例的内容。它看起来非常像IImage *image;
应该是Image
的成员,而不是全局变量(虽然它可能已经是;我无法告诉你,因为你还没有发布定义Image
)。
更新:您现在说createImage
是成员,并且该类应该模拟您链接到的Java类。在这种情况下,它应该是static
。对于类成员,它与Java中的含义大致相同:它与类本身相关联,而不是与任何特定对象相关联。然后定义需要使用Image::
限定名称以指示它是成员,而不是在命名空间中声明的不同函数。所以你需要这样的东西:
class Image {
public:
// some members
static Image * createImage(string); // Add "static" to match the Java class.
// Return a pointer (or a smart pointer)
};
Image * Image::createImage(string) { // Add "Image::" to indicate it's a member
return new Image;
}
// Usage example:
Image * image = Image::createImage("whatever"); // "::" rather than Java's "."
请注意,返回Image
而不是Image *
(或智能指针)将返回Image
对象的副本,这可能(可能)不是你想要什么;这是与Java的另一个重大区别,其中类对象总是通过引用(*)传递。指针是C ++与Java对象引用最接近的东西。
(*)对学生的注意:通过&#34;通过引用&#34;,我的意思是对象本身没有被克隆;对象引用按值传递。
答案 1 :(得分:4)
当需要成为成员函数时,您已将该函数声明为自由函数。只有成员函数具有this
指针。
class image {
//...
Image *createImage(string str)
//...
};
Image *Image::createImage(string str)
{
return this;
}
虽然如果它是一个创建函数,你的逻辑可能是错误的,你不应该使用this
。
答案 2 :(得分:2)
首先,如前所述,createImage(..)必须是类Image的成员函数。 其次,有三种方法可以通过指针,引用和值返回当前对象:
class Image
{
public:
//by Pointer
Image* PointerToImage()
{
return this;
}
const Image* ConstPointerToImage() const
{
return this;
}
//by Reference
Image& ReferenceToImage()
{
return *this;
}
const Image& ReferenceToImage() const
{
return *this;
}
//by Value
Image CopyOfImage() const
{
reuturn *this;
}
}
希望这有帮助。
答案 3 :(得分:-1)
您不需要返回实例,在调用createImage时已经拥有它了吗?