1

クラス 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*/;
}

画像の定義は次のとおりです。

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

JAVA ME の Image クラスに似たクラスを C++ で作成する必要があります (リンク): -これらと同じ名前のクラス (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 は非常に異なる言語であるため、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ではなく返すと、オブジェクトのコピーが返されることに注意してください。これは(おそらく)必要なものではありません。これは、クラス オブジェクトが常に参照 (*) によって渡される Java とのもう 1 つの大きな違いです。ポインターは、C++ が Java のオブジェクト参照に最も近いものです。Image *Image

(*) 衒学者への注意: 「参照渡し」とは、オブジェクト自体が複製されていないことを意味します。オブジェクト参照は値渡しされます。

于 2012-11-15T12:32:39.053 に答える
4

メンバー関数である必要があるときに、その関数をフリー関数として宣言しました。メンバー関数のみがthisポインターを持ちます。

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

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

ただし、それが create 関数の場合、ロジックはおそらく間違っているため、 を使用するべきではありません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 に答える