如何在方法中返回此

时间:2012-11-15 12:25:59

标签: c++

我有一个类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): - 同名的班级(图片) - 方法名称,参数类型和返回类型

4 个答案:

答案 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时已经拥有它了吗?