类 x(继承)C++ 不存在默认构造函数

Posted

技术标签:

【中文标题】类 x(继承)C++ 不存在默认构造函数【英文标题】:no default constructor exists for class x (inheritance) C++ 【发布时间】:2014-01-08 21:32:01 【问题描述】:

我有以下三个标题:

IBaseStates.h

class IBaseStates

public:
    enum STATE;

    virtual void Update( STATE state ) = 0;
;

PlayerStates.h

#pragma once

#include "IBaseStates.h"
#include "Player.h"

class PlayerStates : public IBaseStates, public Player

public:
    enum STATE 
        FLYING,
        FALLING
    ;

    int textureAmount;

    PlayerStates();
    ~PlayerStates( );

    void Update( STATE state );
;

Player.h

#pragma once

#include "StructVertex.h"
#include "SquareVertices.h"
#include "WICTextureLoader.h"

using namespace Microsoft::WRL;
using namespace DirectX;
//using namespace DirectX;

class Player : public SquareVertices

public:
    Player( ComPtr<ID3D11Device1> d3dDevice );
    ~Player();

    void Initialize();
    void Update();

    float x;
    float y;
    float z;
    float rotation;
    float velocity;

    ComPtr<ID3D11Buffer> vertexbuffer;
    ComPtr<ID3D11Buffer> indexbuffer;
    ComPtr<ID3D11ShaderResourceView> texture[3];
protected:
    const ComPtr<ID3D11Device1> d3dDevice;
;

为什么当我在我的 PlayerStates.cpp 文件中为我的 PlayerStates 类定义一个构造函数时,我会得到 ​​p>

no default constructor exists for class Player

PlayerStates.cpp

#include "pch.h"
#include "PlayerStates.h"

PlayerStates::PlayerStates()
: 
    textureAmount( 3 )


【问题讨论】:

【参考方案1】:

当您为类声明非默认构造函数时,编译器不再生成默认构造函数。所以你必须提供你自己的。

PlayerStates 需要在自己的默认构造函数中调用其基类Player 的默认构造函数。所以你要么需要为Player提供一个默认构造函数,要么从PlayerStates'默认构造函数初始化列表中调用它的非默认构造函数。

这隐式调用Player::Player()

PlayerStates::PlayerStates() : textureAmount( 3 ) 

这会调用单参数构造函数:

PlayerStates::PlayerStates() : Player(someComPtr), textureAmount( 3 ) 

【讨论】:

我已经声明了一个 Player 构造函数的 cpp 版本……你是这个意思吗? 您声明了一个带参数的设备,但这在这种情况下没有帮助(因为您的 PlayerStates 构造函数中没有 d3dDevice)。 @JamesT 不行,你需要给Player一个默认构造函数。 默认构造函数是没有参数的。【参考方案2】:

Player 不能在没有ComPtr&lt;ID3D11Device1&gt; d3dDevice 的情况下创建,所以你的PlayerStates 构造函数必须找到一个并将其传递给Player

PlayerStates::PlayerStates()
: 
  Player( globalD3DDevice ),
  textureAmount( 3 )


或者,如果这不是您想要的,请像您在 cmets 中提到的那样翻转继承。

【讨论】:

我知道我之前删除了我的评论,但与此相同的基础...我想保留在玩家腹部的 d3dDevice 不再被 PlayerStates 访问...即使我让 PlayerStates 成为 Player 的朋友......也许反过来是正确的? PlayerStates 需要访问ID3D11Device1 吗? 确实如此。我希望 PlayerStates 能够访问设备,以便我可以加载纹理......纹理加载功能需要一个指向设备的指针......我正在做这个继承来更好地组织代码......你怎么看? 你知道的,别担心..我会整理一些别的东西,谢谢你的帮助,伙计

以上是关于类 x(继承)C++ 不存在默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

具有非默认构造函数的 C++ 继承

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

C++调用父类的构造函数规则

继承默认构造函数,矛盾吗?

C++构造和析构

8-4:C++继承之子类的默认构造函数如何使用