1

我有一个类 Image,我需要返回这个类的实例。简单的方法是什么?我是一名 java 程序员,“return this”给了我一个错误。

#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*/;
}

这是图像的定义:

#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 类的类(链接):-这些相同的类名称(Image)-这些相同的方法名称、参数类型和返回类型

4

4 回答 4

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++的好书。

您还应该避免使用全局变量,尤其是对于逻辑上属于类实例的事物。它看起来很像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 的另一大区别,Java 中的类对象总是通过引用 (*) 传递。指针是 C++ 最接近 Java 对象引用的东西。

(*) 学究们注意:“通过引用传递”是指对象本身没有被克隆;对象引用是按值传递的。

于 2012-11-15T12:32:39.053 回答
4

当它需要成为成员函数时,您已将该函数声明为自由函数。只有成员函数有this指针。

class image {
   //...
   Image *createImage(string str)
   //...
};

Image *Image::createImage(string str)
{
    return this;
}

虽然如果它是一个创建函数,你的逻辑可能是错误的,你不应该使用this.

于 2012-11-15T12:27:46.927 回答
2

首先,createImage(..) 必须是 Image 类的成员函数,如前所述。二、返回当前对象有3种方式,按指针、按引用、按值:

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;
    }
}

希望这可以帮助。

于 2012-11-15T13:02:50.540 回答
-1

您不需要返回实例,调用 createImage 时已经拥有它?

于 2012-11-15T12:27:38.387 回答