2

コードでこれが 2 回発生しましたが、ヘッダー ファイル "Scene.h" があると不平を言っている理由がわかりません。

#pragma once

#include <iostream>
#include <string>

#include "Image.h"
#include "InteractiveObject.h"

using namespace std;

    class Scene
    {
    public:
        int id;
        string title;
        Image* backgroundImage;
        InteractiveObject interactiveObjects[ 1 ];

        D3DXVECTOR3 pos;

        Scene( int id_, string title_, Image* backgroundImage_ )
            : 
            id( id_ ),
            title( title_ ),
            backgroundImage( backgroundImage_ )
        {
            this->pos.x = 0.0f;
            this->pos.y = 0.0f;
            this->pos.z = 0.0f;
        }
    };

「InteractiveObject.h」という別のファイルがあります。

#pragma once

#include <iostream>
#include <string>

#include "Image.h"
enum { CHARACTER, OBJECT };

class InteractiveObject
{
public:
    int id;
    int type;

    float x;
    float y;
    float z;

    D3DXVECTOR3 pos;

    string title;
    Image* theImage;
    InteractiveObject( int id_, string title_, Image* theImage_, int type, float x, float y, float z )
        : 
        id( id_ ),
        title( title_ ),
        theImage( theImage_ )
    {
        this->pos.x = x;
        this->pos.y = y;
        this->pos.z = z;
    }
};

私のインテリセンスは、次のものがあると不平を言っています:

エラー 1 エラー C2512: 'InteractiveObject': 適切な既定のコンストラクターがありません c:\users\james\documents\visual studio 2012\projects\game\game\scene.h 26 1 ゲーム

両方にデフォルトのコンストラクターがあることを考慮したアイデアはありますか?

編集:: - - - - -

ここにいる皆さんに感謝します。

InteractiveObject( int id_, string title_, Image* theImage_, int type_, float x_, float y_, float z_ )
        : 
        id( id_ ),
        title( title_ ),
        theImage( theImage_ ),
        type( type_ ),
        x( x_ ),
        y( y_ ),
        z( z_ )
    {

問題は消えます..これが最善の方法であるかどうかはわかりません.しばらくすると泣きながら戻ってきます. 最も簡潔な回答だと思う回答に投票していただけますか?

私の現在の要件は、ゲーム コンストラクターで宣言され、画面に描画するために反復処理される一定量のインタラクティブ オブジェクトをシーンに含めることです。

"game.cpp":

Game::Game( HWND hWnd, Mouse &mouse  )
    :
    gfx( hWnd ),
    mouse( mouse )
{
    gfx.d3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);

    //--------------Scene 0---------------
    scenes[ 0 ] = Scene( 0, "La barra de funk", new Image( gfx, "Images/Scene/Area/Bar/Background.jpg", 1024, 768, FALSE ) );
    scenes[ 0 ].interactiveObjects[ 0 ] = new InteractiveObject( 0, "la rockola de muse", new Image( gfx, "Images/Scene/Area/Bar/InteractiveObjects/Jukebox.png", 428, 586, TRUE ), OBJECT, 300.0f, 200.0f, 1.0f );
};

Game::~Game()
{
    // Delete scenes array

    /*for( int a = 0; a < sizeof( scenes ) / sizeof( Scene ); a++ )
    {
        scenes[ a ] = NULL;
        delete scenes[ a ];
    }*/
};

void Game::Go()
{
    gfx.Begin();
    ComposeFrame();
    gfx.End();
    gfx.Present();
};

void Game::ComposeFrame()
{
    for each ( Scene currentScene in scenes )
    {
        currentScene.backgroundImage->sprite->Begin( D3DXSPRITE_ALPHABLEND );
        currentScene.backgroundImage->sprite->Draw( currentScene.backgroundImage->gTexture, NULL, NULL, &currentScene.pos, 0xFFFFFFFF );
        currentScene.backgroundImage->sprite->End();

        for each ( InteractiveObject currentInteractiveObject in currentScene.interactiveObjects )
        {
            currentInteractiveObject.theImage->sprite->Begin( D3DXSPRITE_ALPHABLEND );
            currentInteractiveObject.theImage->sprite->Draw( currentScene.backgroundImage->gTexture, NULL, NULL, &currentInteractiveObject.pos, 0xFFFFFFFF );
            currentInteractiveObject.theImage->sprite->End();
        }       
    }
}
4

5 に答える 5

3

クラスにデフォルト以外のコンストラクター (つまり、引数を取るコンストラクター) があります。ゼロ引数を取るデフォルトのコンストラクターはありません。

オブジェクトを C 配列に配置するための要件の 1 つは、オブジェクトがデフォルトで構築可能であることです。それ以外の場合、コンパイラーはそれらを構築する方法がありません。配列を宣言するとき、コンパイラーは配列内のすべてのインスタンスをデフォルトで構築する必要があります (配列内のオブジェクトにコンストラクター引数を渡す方法はありません)。

これを修正するには、これらのクラスを配列で使用しないようにする必要があります (たとえば、必要に応じてすべてのオブジェクト配列をポインターの配列に置き換えることができますが、メモリ管理が難しくなります)。または、すべてのクラス メンバーを適切な値に初期化する単純なデフォルト コンストラクターを追加するだけです。

于 2013-03-31T00:58:23.450 に答える
3

既定のコンストラクターは、引数を取らないか、すべての名前付きパラメーターに既定値があるため、引数を渡す必要はありません。コードから、クラスのコンストラクターはパラメーターを必要としますが、呼び出すときにクラスInteractiveObjectでも構築されますScene

InteractiveObject interactiveObjects[ 1 ];

これを ( を使用して) 動的に作成するかnew、引数のないコンストラクターをInteractiveObjectクラスに追加することができます。

于 2013-03-31T01:00:14.120 に答える
0

以来:

InteractiveObject interactiveObjects[ 1 ];

default constructorクラスの呼び出しになりますInteractiveObject。ただし、提供したコンストラクターは次の理由で適合しませんdefault constructor

1. it has arguments
2. all of its arguments does not have default values.

default constructorそのため、パラメーターを指定せずに呼び出すことができないという意味で、コンストラクターを として扱うことはできません。このため、コンパイラはそれを生成できないため、default constructorそのエラーが発生します。

于 2013-03-31T00:58:18.007 に答える
0
InteractiveObject( int id_, string title_, Image* theImage_, int type, float x, float y, float z )

これらの引数をオブジェクト宣言に入れる必要があります。

于 2013-03-31T00:59:29.640 に答える
-1

ここ:

InteractiveObject interactiveObjects[ 1 ];

InteractiveObjects の配列を宣言していInteractiveObjectますが、オブジェクトを作成するための引数のない既定のコンストラクターがありません。

代わりに、 を使用して実行時にこれをインスタンス化する必要がありますnew

于 2013-03-31T00:58:03.520 に答える