I'll try to keep this simple, i have an abstract class called Shape (Shape.h) which has a few pure virtual functions, cool.

so I have another class called Circle (Circle.h and Circle.cpp) which extends Shape.

here's the code.

(In Shape.h)

``````#ifndef SHAPE_H
#define SHAPE_H
#include "Point.h"

class Shape {  // ABC
public:
virtual ~Shape() {}
virtual void draw() const = 0;

#if 1
/*** transformations ***/

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
virtual void translate(const Point& delta) = 0;

// reflection about x-axis, e.g. (1,2) -> (1,-2)
virtual void xreflect() = 0;

// reflection about y-axis, e.g. (1,2) -> (-1,2)
virtual void yreflect() = 0;

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
virtual void unTranslate(const Point& delta) = 0;

// reflection about x-axis, e.g. (1,2) -> (1,-2)
virtual void unXreflect() = 0;

// reflection about y-axis, e.g. (1,2) -> (-1,2)
virtual void unYreflect() = 0;

#endif
};
#endif``````

(In Circle.h)

``````#ifndef CIRCLE_H
#define CIRCLE_H
#include <iostream>
#include <string>
#include "Shape.h"
#include "Point.h"

class Circle: public Shape {
public:
explicit Circle(std::istream& is);
virtual void draw() const;

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
virtual void Shape::translate(const Point& delta);

// reflection about x-axis, e.g. (1,2) -> (1,-2)
virtual void Shape::xreflect();

// reflection about y-axis, e.g. (1,2) -> (-1,2)
virtual void Shape::yreflect();

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
virtual void Shape::unTranslate(const Point& delta);

// reflection about x-axis, e.g. (1,2) -> (1,-2)
virtual void Shape::unXreflect();

// reflection about y-axis, e.g. (1,2) -> (-1,2)
virtual void Shape::unYreflect();

private:
Point  centre_;
};
#endif``````

(In Circle.cpp)

``````#include "stdafx.h"
#include "Circle.h"
#include <cmath>
using namespace std;

Circle::Circle(istream& is) {
if (!is)
throw "Circle::Circle(const std::string&)";
}

void
Circle::draw() const {
cerr << "[C: " << centre_ << ", " << radius_ << "]" << endl;
}

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
void Circle::translate(const Point& delta)
{
centre_.setX(centre_.getX() + delta.getX());
centre_.setY(centre_.getY() + delta.getY());
}

// reflection about x-axis, e.g. (1,2) -> (1,-2)
void Circle::xreflect()
{
centre_.setY(-abs(centre_.getY()));
}

// reflection about y-axis, e.g. (1,2) -> (-1,2)
void Circle::yreflect()
{
centre_.setX(-abs(centre_.getX()));
}

// translate by amount delta, e.g. if delta is (1,2), the point (3,4)
// is transformed to (4,6)
void Circle::unTranslate(const Point& delta)
{
centre_.setX(centre_.getX() - delta.getX());
centre_.setY(centre_.getY() - delta.getY());
}

// reflection about x-axis, e.g. (1,2) -> (1,-2)
void Circle::unXreflect()
{
centre_.setY(abs(centre_.getY()));
}

// reflection about y-axis, e.g. (1,2) -> (-1,2)
void Circle::unYreflect()
{
centre_.setX(abs(centre_.getX()));
}``````

I also have a Shape Factory class (ShapeFactory.h) which creates and returns an object based on the parameter you give it.

``````#ifndef SHAPEFACTORY_H
#define SHAPEFACTORY_H
#include <iostream>
#include <string>
#include "Shape.h"
#include "Circle.h"
#include "Triangle.h"

class ShapeFactory {
public:
ShapeFactory(std::istream& is): in_(&is) {}
Shape* create() {
std::string  type;
if (!(*in_ >> type))
return 0;
if (type == "C")
return new Circle(*in_);
if (type == "T")
return new Triangle(*in_);

return 0;  // if it's not one of the valid types
}

private:
std::istream  *in_;
};
#endif``````

I've done this entire project in Visual Studio 2010, compiles with no errors and warnings, however, when i try to compile with gcc (g++) it gives the me following errors:

In file included from ShapeFactory.h:6:0,
from program.cpp:6:
Circle.h:15:51: error: cannot declare member function 'Shape::translate' within
'Circle'
Circle.h:18:32: error: cannot declare member function 'Shape::xreflect' within '
Circle'
Circle.h:21:32: error: cannot declare member function 'Shape::yreflect' within '
Circle'
Circle.h:25:53: error: cannot declare member function 'Shape::unTranslate' withi
n 'Circle'
Circle.h:28:34: error: cannot declare member function 'Shape::unXreflect' within
'Circle'
Circle.h:31:34: error: cannot declare member function 'Shape::unYreflect' within
'Circle'
In file included from ShapeFactory.h:7:0,
from program.cpp:6:
Triangle.h:15:51: error: cannot declare member function 'Shape::translate' withi
n 'Triangle'
Triangle.h:18:32: error: cannot declare member function 'Shape::xreflect' within
'Triangle'
Triangle.h:21:32: error: cannot declare member function 'Shape::yreflect' within
'Triangle'
Triangle.h:25:53: error: cannot declare member function 'Shape::unTranslate' wit
hin 'Triangle'
Triangle.h:28:34: error: cannot declare member function 'Shape::unXreflect' with
in 'Triangle'
Triangle.h:31:34: error: cannot declare member function 'Shape::unYreflect' with
in 'Triangle'
In file included from program.cpp:6:0:
ShapeFactory.h: In member function 'Shape* ShapeFactory::create()':
ShapeFactory.h:17:25: error: cannot allocate an object of abstract type 'Circle'

Circle.h:8:28: note: because the following virtual functions are pure within '
Circle':
Shape.h:15:16: note: virtual void Shape::translate(const Point&)
Shape.h:18:16: note: virtual void Shape::xreflect()
Shape.h:21:16: note: virtual void Shape::yreflect()
Shape.h:25:16: note: virtual void Shape::unTranslate(const Point&)
Shape.h:28:16: note: virtual void Shape::unXreflect()
Shape.h:31:16: note: virtual void Shape::unYreflect()
ShapeFactory.h:19:27: error: cannot allocate an object of abstract type 'Triangl
e'
Triangle.h:8:30: note: because the following virtual functions are pure within
'Triangle':
Shape.h:15:16: note: virtual void Shape::translate(const Point&)
Shape.h:18:16: note: virtual void Shape::xreflect()
Shape.h:21:16: note: virtual void Shape::yreflect()
Shape.h:25:16: note: virtual void Shape::unTranslate(const Point&)
Shape.h:28:16: note: virtual void Shape::unXreflect()
Shape.h:31:16: note: virtual void Shape::unYreflect()

I simply cannot figure out what is wrong, can anybody help me please? It pisses me off when something works in a compiler but doesn't in a different one.

You should remove the `Shape::` in front of each function name within the declaration of the Circle or Triangle classes, you don't need that and should have it there (and that's the error your compiler reports).

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.