我目前正在开发一个c++程序,其主要目的是您有两个不同的对象在屏幕上漂浮,碰撞到彼此之间等。
无论如何,我遇到的问题是我需要从我的基类派生两个类。但是,在我的派生类的定义和声明中,我遇到了一个错误,无法解决。我已经在网上搜索并寻求同事的建议,但是无法找到问题的根源。该代码是
Jetsam(RandomNumber &rnd, Console &console);
(对于头文件)
和
Jetsam::Jetsam(RandomNumber &rnd, Console &console): Element(rnd, console){};
(对于cpp文件)
我收到的错误是IntelliSense:
有谁知道错在哪里。任何帮助将非常感激 :)
干杯们,Alyn。
按照要求:
捷信
#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
};
最佳答案
问题在于,Element
和Jetsam
类都定义了以下成员:
RandomNumber &rnd;
Console &console;
这意味着
Jetsam
的每个实例实际上都有其中两个:Element::rnd
和Jetsam::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
甚至更可取。关于c++ - C++继承的构造方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15813684/