我有一个基类精灵: 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
sprite.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
actor.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";
}
两个类都使用向量类:
vector.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
vector.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);
但是运行我的生成文件时出现此错误:
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
我假设我在构造函数中语法有误,但似乎无法修复,有什么建议吗?
答案 0 :(得分:1)
在头文件中,有以下行:
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)
部分)时,会认为“哦,好的,您在这里定义函数”。然后,对于为什么要使用分号而不是函数的实际主体,这感到很困惑,这就是您要得到的编译器错误。