2

我目前正在开发一个 c++ 程序,主要目的是你有两个不同的对象在屏幕上浮动,相互碰撞等等。无论如何,我遇到的问题是我需要从我的基类派生两个类。但是,在派生类的定义和声明中,我遇到了一个错误并且无法解决。我已经搜索了网络并征求了我的同事的意见,但无法找到问题的根源。代码是

Jetsam(RandomNumber &rnd, Console &console);

(对于头文件)

Jetsam::Jetsam(RandomNumber &rnd, Console &console): Element(rnd, console){};

(对于 cpp 文件)

我得到的错误是 IntelliSense:

Jetsam::Jetsam(RandomNumber &rnd, Console &console)" 没有为以下内容提供初始化程序:e:\c++\my game\my game\jetsam.cpp。

有谁知道出了什么问题。任何帮助将非常感激 :)

干杯,阿林。

按照要求:

捷萨姆

#pragma once
#include "RandomNumber.h"
#include "Console.h"
#include "element.h"
#include <iostream>
using namespace std;

class Jetsam : public Element
{
public:
    Jetsam(RandomNumber &rnd, Console &console);
    ~Jetsam();
    void printAt(void);

protected:
    RandomNumber &rnd;
    Console &console;
};

元素

#pragma once
#include "RandomNumber.h"
#include "Console.h"
#include <iostream>
using namespace std;

// code shell, amend as appropriate

class Element
{
protected:
    RandomNumber &rnd;
    Console &console;
    int x;
    int y;
    int energy;
    int direction;
    int speed;
    char identifier;
    static char nextIdentifier;

public:

    Element();
    Element(RandomNumber &rnd, Console &console);
    // precondition: references to RandomNumber and Console objects are provided, along with any other desired parameters
    // postcondition: Element object created and private members initialised
    // example of use: Element element(rnd, console);


    virtual void print(void);
    // precondition: none
    // postcondition: identifier, x and y are sent to the standard output
    // example of use: element.print();

    virtual void printAt(void)=0;
    // precondition: none
    // postcondition: text background is changed proportionate to its energy in the following order
    //                BLUE, GREEN, AQUA, YELLOW, RED, PURPLE, e.g. an object with 23 energy would have an AQUA background
    //                object's identifier is sent to the standard output at its x, y coordinates
    // example of use: element.printAt();

    int getX(void);
    int getY(void);
    int getEnergy(void);
    int getDirection(void);
    int getSpeed(void);
    //getters for the base class
    void setX(int);
    void sety(int);
    void setEnergy(int);
    void setDirection(int);
    void setSpeed(int);
    //setters for the base class
};
4

1 回答 1

3

问题是类ElementJetsam定义这些成员:

RandomNumber &rnd;
Console &console;

这意味着 的每个实例Jetsam实际上都有其中两个:Element::rndJetsam::rnd. 由于它们是引用,它们必须在构造函数的 mem-initialiser 列表中进行初始化;没有其他方法可以初始化它们。

要简单地修复错误,您必须这样做:

Jetsam::Jetsam(RandomNumber &rnd, Console &console) :
  Element(rnd, console)
  , rnd(rnd)
  , console(console)
{}

但是,我怀疑您并不真的希望它们被复制(尤其是因为它们在protected里面Element)。所以正确的解决方案是简单地从Jetsam. 之后,Jetsam将如下所示:

class Jetsam : public Element
{
public:
    Jetsam(RandomNumber &rnd, Console &console);
    ~Jetsam();
    virtual void printAt(void);
};

请注意,virtual在派生类中重写虚函数时重复关键字通常是一个好主意(它有助于提高可读性),即使标准没有要求。当然,如果使用支持它的 C++11 编译器,那就override更可取了。

于 2013-04-04T14:28:57.403 回答