Для класса не существует конструктора по умолчанию, но я объявил его

У меня это происходит дважды в моем коде, я не уверен, почему он жалуется, что у меня есть заголовочный файл «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;
    }
};

Мой intellisense жалуется, что есть:

Ошибка 1 ошибка C2512: «InteractiveObject»: нет подходящего конструктора по умолчанию c:\users\james\documents\visual studio 2012\projects\game\game\scene.h 26 1 Game

Любые идеи, учитывая, что у обоих есть конструкторы по умолчанию?

РЕДАКТИРОВАТЬ::----------

Итак, спасибо всем здесь, я вижу, что если я сделаю это :;

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

person Jimmyt1988    schedule 31.03.2013    source источник
comment
InteractiveObject interactiveObjects[ 1 ]; Как именно вы ожидаете, что это будет работать? Как бы он создал InteractiveObject?   -  person David Schwartz    schedule 31.03.2013
comment
@DavidSchwartz - Не могли бы вы проверить мое последнее редактирование (нижний фрагмент кода) ... Я действительно новичок в С++, я пытался создать сцену, а затем вставлять в нее интерактивные объекты в своем игровом конструкторе.   -  person Jimmyt1988    schedule 31.03.2013
comment
@DavidSchwartz - Мех, я заменил все это на указатели, работает как шарм!   -  person Jimmyt1988    schedule 31.03.2013


Ответы (5)


Конструктор по умолчанию не требует передачи ему каких-либо аргументов либо потому, что он не принимает никаких аргументов, либо для всех именованных параметров существуют значения по умолчанию. Из вашего кода конструктору класса InteractiveObject требуются параметры, но он также создается в вашем классе Scene при вызове

InteractiveObject interactiveObjects[ 1 ];

Вы можете создать это динамически (используя new) или добавить конструктор без аргументов в класс InteractiveObject.

person radical7    schedule 31.03.2013
comment
Спасибо всем... Думаю, я понял, я вернусь и посмотрю, смогу ли я заставить его работать... терпите меня - person Jimmyt1988; 31.03.2013

В ваших классах есть конструкторы не по умолчанию (то есть конструкторы, принимающие аргументы). У них нет конструкторов по умолчанию, которые не принимают аргументов.

Одним из требований для размещения объектов в массивах C является то, что объекты должны быть конструируемыми по умолчанию. В противном случае у компилятора нет возможности создать их — когда вы объявляете массив, компилятор должен создать по умолчанию все экземпляры в массиве (нет возможности передать аргументы конструктора объектам в массиве).

Чтобы исправить это, вам либо нужно убедиться, что вы никогда не используете эти классы в массивах (например, вы можете заменить все массивы объектов массивами указателей, если хотите, но тогда управление памятью становится сложнее). В качестве альтернативы просто добавьте простые конструкторы по умолчанию, которые инициализируют все члены класса разумными значениями.

person Adam Rosenfield    schedule 31.03.2013
comment
Причина, по которой я не использовал указатели, заключается в том, что я хотел использовать функцию foreach для С++ :( возможно, это плохой выбор? - person Jimmyt1988; 31.03.2013

С:

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, поэтому у вас есть эта ошибка.

person taocp    schedule 31.03.2013

InteractiveObject( int id_, string title_, Image* theImage_, int type, float x, float y, float z )

Вам нужно поместить эти аргументы в объявление объекта.

person Etherealone    schedule 31.03.2013

Здесь:

InteractiveObject interactiveObjects[ 1 ];

Вы объявляете массив InteractiveObjects, но InteractiveObject не имеет конструктора по умолчанию с нулевым аргументом для создания объекта.

Вместо этого вам нужно создать экземпляр во время выполнения, используя new.

person slugonamission    schedule 31.03.2013