繁体   English   中英

C++派生类构造函数调用基类构造函数错误

[英]C++ derived class constructor call base class constructor errors

我有一个基类精灵:sprite.hh

#include <iostream>
#include "vector.hh"

#ifndef SPRITE
#define SPRITE

class sprite
{
    private:
        vector pos;
        //the width and height of the sprite
        vector dimensions;
        int imArrIndex;
        
    public:
        sprite();
        sprite(vector p, vector d, int i);
        void setPos(vector v);
        vector getPos();
        void setDimensions(vector v);
        vector getDimensions();
        void setImArrIndex(int i);
        int getImArrIndex();
        void movePos(vector v);
};
#endif

精灵.cc:

#include <iostream>
#include "sprite.hh"
#include "vector.hh"

using namespace std;

sprite::sprite()
{
    cout << "sprite created\n";
}

sprite::sprite(vector p, vector d, int i)
{
    pos = p;
    dimensions = d;
    imArrIndex = i;
}

void sprite::setPos(vector v)
{
    pos = v;
}

vector sprite::getPos()
{
    return pos;
}

void sprite::setDimensions(vector v)
{
    dimensions = v;
}

vector sprite::getDimensions()
{
    return dimensions;
}

void sprite::setImArrIndex(int i)
{
    imArrIndex = i;
}

int sprite::getImArrIndex()
{
    return imArrIndex;
}

void sprite::movePos(vector v)
{
    pos.setX(pos.getX() + v.getX());
    pos.setY(pos.getY() + v.getY());
}

和一个派生类演员:actor.hh:

#include <iostream>
#include "sprite.hh"
#include "vector.hh"

#ifndef ACTOR
#define ACTOR

class actor : public sprite
{
    private:
        
    public:
        actor(vector p, vector d, int i) : sprite(p, d, i);
};
#endif

演员.cc:

#include <iostream>
#include "sprite.hh"
#include "actor.hh"
#include "vector.hh"

using namespace std;

actor::actor(vector p, vector d, int i) : sprite(p, d, i)
{
    cout << "actor created\n";
}

这两个类都使用向量类:

向量.hh:

#include <iostream>
#include <cmath>
#ifndef VECTOR
#define VECTOR

class vector
{
    private:
        int x;
        int y;
    public:
        vector();
        vector(int px, int py);
        void setX(int px);
        int getX();
        void setY(int py);
        int getY();
        //get the pixel distance between this vector and a given vector
        int getDistance(vector v);
};
#endif

向量.cc:

#include <iostream>
#include "vector.hh"

using namespace std;

vector::vector()
{
    cout << "vector created\n";
}

vector::vector(int px, int py)
{
    x = px;
    y = py;
    cout << "vector created\n";
}
void vector::setX(int px)
{
    x = px;
}
int vector::getX()
{
    return x;
}
void vector::setY(int py)
{
    y = py;
}
int vector::getY()
{
    return y;
}
//get the pixel distance between this vector and a given vector
int vector::getDistance(vector v)
{
    return sqrt( pow(x - v.getX(), 2) + pow(y - v.getY(), 2) );
}

现在我只是想在我的主要代码中使用此部分获取演员的构造函数:

vector p(0,0);
vector d(0,0);

actor a(p, d, 1);

但是在运行我的 makefile 时出现此错误:

g++ -c level.cc
In file included from level.cc:6:
actor.hh: In constructor ‘actor::actor(vector, vector, int)’:
actor.hh:15:53: error: expected ‘{’ at end of input
   actor(vector p, vector d, int i) : sprite( p, d, i);
                                                     ^
make: *** [makefile:11: level.o] Error 1

如果我不在派生类中调用基本构造函数,我的 makefile 工作得很好,所以我确定它不是我的 makefile 中的错误,但这里是我的 makefile 以防万一:

FrogGame: frogmain.o game.o level.o sprite.o actor.o vector.o
    g++  -std=c++0x -Wall -pedantic -o FrogGame frogmain.o game.o level.o sprite.o actor.o vector.o  `sdl2-config --cflags --libs` -lSDL2_image
    
frogmain.o: frogmain.cc game.hh level.hh sprite.hh vector.hh
    g++ -c frogmain.cc
    
game.o: game.cc level.hh sprite.hh actor.hh vector.hh
    g++ -c game.cc
    
level.o: level.cc sprite.hh actor.hh vector.hh
    g++ -c level.cc

actor.o: actor.cc vector.hh
    g++ -c actor.cc

sprite.o: sprite.cc vector.hh
    g++ -c sprite.cc

vector.o: vector.cc
    g++ -c vector.cc

我假设我在构造函数中有一些语法错误,但似乎无法修复它,有什么建议吗?

在您的头文件中,您有这一行:

public:
    actor(vector p, vector d, int i) : sprite(p, d, i); // Error!

我明白你想在这里做什么,但这不是合法的 C++ 语法。 如果您打算声明actor构造函数,然后在.cpp文件中定义它,这就是您在这里所做的,只需编写

actor(vector p, vector d, int i);

然后,在 .cpp 文件中,如您所做的那样,写

actor::actor(vector p, vector d, int i) : sprite(p, d, i) 
{
    cout << "actor created\n"; 
}

正如您现在编写的那样,C++ 编译器会看到actor构造函数的声明。 当它看到初始化列表( : sprite(p, d, i)部分)时,它认为“哦,好吧,你在这里定义了函数。” 然后很困惑为什么有一个分号而不是函数的实际主体,这就是你得到的编译器错误所说的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM