使用另一个派生 class 的参数派生 class 初始化
Derived class initialization with parameter of another derived class
我是 Abstract 的新手 classes 所以请原谅任何无知的错误
作业是我学校给的,所以要用main.cpp文件,几乎原样
我正在尝试使用 C++11 在 Eclipse 中创建一个简单的计算器
存在一个带有两个虚拟方法的简单抽象 class。
两个派生的 classes 就是 "Result" 和 "Const" classes。
这是名为
的摘要 class 的头文件
Expression.h
class Expression
{
public:
Expression();
virtual ~Expression();
//methods
};
下面是表达式的源文件
Expression.cpp
#include "expression.h"
#include <iostream>
Expression::Expression(){}
Expression::~Expression(){}
然后我创建了两个 classes 称为 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));
我得到的错误是
Conversion from 'Const* to non-scalar type 'Result' requested
问题是这一行中描述的内容应该按原样使用,我似乎无法找到它到底是什么。
编辑
首先问的问题显然是我的错造成的误导,试图修正问题以便准确描述我的问题
如果你有两个派生的 classes DerivedClass1
和 DerivedClass2
都派生自一些 BaseClass
然后实例化一个指向 DerivedClass1
的指针并使用它以多态方式使用:
BaseClass* p = new DerivedClass1;
要创建指向 DerivedClass2
的基 class 指针,请使用:
BaseClass* p = new DerivedClass2;
而不是:
DerivedClass1* p = new DerivedClass2;
在您的示例中,Result
和 Const
class 都是从 Expression
class 派生的,因此会造成混淆。要传入 SomeClass&
类型的参数,创建一个 SomeClass
的临时对象并将其传入:
SomeClass o;
someFunction(o);
您通过为 Const
和 Result
创建一个公共基础 class 开始正确,但随后完全忽略了它。
你所有的问题确实都在这一行:
Result res = (new Const(4));
首先,C++中的operator new
returns是指针,不是引用。此外,这将是利用您的基础的好地方 class:
Expression* res = new Const(4);
由于您将方法 evaluate()
和 print()
声明为 virtual
,因此 res
指向的对象将被正确解析为 Const
的实例当您致电 res->print()
或 res->evaluate()
.
这将使用 print()
的 Const
版本。如果你想使用 Result
版本 - abstract classes 在这里对你没有帮助,你需要使用转换。在 Result
中创建自己的 operator=(Const &)
或在 Const
中创建 operator Result()
。
Class Result
和Const
是两个不同的类。这意味着类型转换
Result *res = (new Const(4));
不可能。做你想做的事,因为 类 都继承自 Expression
,做:
Expression * res = new Result( objConst);
其中 objConst
是一个 Const
对象。
一个问题是
double point= value;
没有初始化你的成员,而是一个新的未使用的局部变量。
就这样
point = value;
我是 Abstract 的新手 classes 所以请原谅任何无知的错误
作业是我学校给的,所以要用main.cpp文件,几乎原样
我正在尝试使用 C++11 在 Eclipse 中创建一个简单的计算器
存在一个带有两个虚拟方法的简单抽象 class。
两个派生的 classes 就是 "Result" 和 "Const" classes。 这是名为
的摘要 class 的头文件Expression.h
class Expression
{
public:
Expression();
virtual ~Expression();
//methods
};
下面是表达式的源文件
Expression.cpp
#include "expression.h"
#include <iostream>
Expression::Expression(){}
Expression::~Expression(){}
然后我创建了两个 classes 称为 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));
我得到的错误是
Conversion from 'Const* to non-scalar type 'Result' requested
问题是这一行中描述的内容应该按原样使用,我似乎无法找到它到底是什么。
编辑
首先问的问题显然是我的错造成的误导,试图修正问题以便准确描述我的问题
如果你有两个派生的 classes DerivedClass1
和 DerivedClass2
都派生自一些 BaseClass
然后实例化一个指向 DerivedClass1
的指针并使用它以多态方式使用:
BaseClass* p = new DerivedClass1;
要创建指向 DerivedClass2
的基 class 指针,请使用:
BaseClass* p = new DerivedClass2;
而不是:
DerivedClass1* p = new DerivedClass2;
在您的示例中,Result
和 Const
class 都是从 Expression
class 派生的,因此会造成混淆。要传入 SomeClass&
类型的参数,创建一个 SomeClass
的临时对象并将其传入:
SomeClass o;
someFunction(o);
您通过为 Const
和 Result
创建一个公共基础 class 开始正确,但随后完全忽略了它。
你所有的问题确实都在这一行:
Result res = (new Const(4));
首先,C++中的operator new
returns是指针,不是引用。此外,这将是利用您的基础的好地方 class:
Expression* res = new Const(4);
由于您将方法 evaluate()
和 print()
声明为 virtual
,因此 res
指向的对象将被正确解析为 Const
的实例当您致电 res->print()
或 res->evaluate()
.
这将使用 print()
的 Const
版本。如果你想使用 Result
版本 - abstract classes 在这里对你没有帮助,你需要使用转换。在 Result
中创建自己的 operator=(Const &)
或在 Const
中创建 operator Result()
。
Class Result
和Const
是两个不同的类。这意味着类型转换
Result *res = (new Const(4));
不可能。做你想做的事,因为 类 都继承自 Expression
,做:
Expression * res = new Result( objConst);
其中 objConst
是一个 Const
对象。
一个问题是
double point= value;
没有初始化你的成员,而是一个新的未使用的局部变量。
就这样
point = value;