我是抽象类的新手,所以请原谅任何无知的错误
这个练习来自我的学校,所以main.cpp文件将被使用,几乎就像它一样
我正在尝试使用C ++ 11在Eclipse中创建一个简单的计算器
存在一个简单的Abstract类,它有两个虚方法。
两个派生类只是"结果"和#34; Const"类。 这是名为
的Abstract类的头文件Expression.h
class Expression
{
public:
Expression();
virtual ~Expression();
//methods
};
以下是Expression
的源文件Expression.cpp
#include "expression.h"
#include <iostream>
Expression::Expression(){}
Expression::~Expression(){}
然后我创建了两个名为Const和Result
的类Const.h
#include <iostream>
#include "expression.h"
class Const : public Expression
{
public:
Const(int value);
//inherited methods
private:
int value;
};
和源文件
Const.cpp
#include "expression.h"
#include "Const.h"
Const::Const(int x)
{
value=x;
};
//inherited methods
Result.h
#include <iostream>
#include "expression.h"
#include "Const.h"
class Result : public Expression
{
public:
Result(Const& c);
//inherited methods
private:
double value;
};
Result.cpp
#include "expression.h"
#include "Result.h"
Result::Result(Const& c)
{
value=c.point;
};
//inherited methods
所以我需要的是理解
的main.cpp
#include <iostream>
#include "expression.h"
#include "const.h"
#include "result.h"
void testResult()
{
Result res (new Const(4));
//Here an inherited method will be used to print the contents of object res
}
int main()
{
testResult();
return 0;
}
我无法解决的问题是行
Result res (new Const(4));
我得到的错误是
从Const *转换为非标量类型&#39;结果&#39;请求的
事情是,这一行中描述的内容应该按原样使用,而我似乎无法确切地找到它是什么。
修改
由于我的过错,首先提出的问题显然具有误导性,试图解决问题以便准确描述我的问题
答案 0 :(得分:0)
如果有两个派生类DerivedClass1
和DerivedClass2
都派生自某些BaseClass
然后实例化指向DerivedClass1
的指针并以多态方式使用它:< / p>
BaseClass* p = new DerivedClass1;
创建指向DerivedClass2
的基类指针:
BaseClass* p = new DerivedClass2;
而不是:
DerivedClass1* p = new DerivedClass2;
在您的示例中,Result
和Const
类都派生自Expression
类,因此存在混淆。要传入SomeClass&
类型的参数,请创建SomeClass
的临时对象并将其传入:
SomeClass o;
someFunction(o);
答案 1 :(得分:0)
您通过为Const
和Result
创建公共基类来正确启动,但后来完全忽略了它。
你所有的问题确实都在这一行:
Result res = (new Const(4));
首先,C ++中的operator new
返回一个指针,而不是一个引用。此外,这将是一个使用基类的好地方:
Expression* res = new Const(4);
由于您将方法evaluate()
和print()
声明为virtual
,因此当您指向的res
对象将被正确解析为Const
的实例致电res->print()
或res->evaluate()
。
这将使用Const
的{{1}}版本。如果你想使用print()
版本 - 抽象类对你没有帮助,你需要使用强制转换。在Result
或operator=(Const &)
中Result
创建您自己的operator Result()
。
答案 2 :(得分:0)
班级Result
和Const
是两个不同的班级。意思是类型转换
Result *res = (new Const(4));
是不可能的。要做你想做的事,因为这两个类都继承自Expression
Expression * res = new Result( objConst);
其中objConst
是Const
个对象。
答案 3 :(得分:0)
一个问题是
double point= value;
不会初始化您的成员,而是新的未使用的本地变量。
只是做
point = value;