【问题标题】:Derived class initialization with parameter of another derived class使用另一个派生类的参数进行派生类初始化
【发布时间】:2017-12-13 09:25:10
【问题描述】:

我是抽象类的新手,所以请原谅任何无知的错误

练习是我学校给的,所以要用main.cpp文件,差不多就这样

我正在尝试使用 C++11 在 Eclipse 中创建一个简单的计算器

存在一个带有两个虚方法的简单抽象类。

这两个派生类就是“Result”和“Const”类。 这是抽象类的头文件,名为

表达式.h

class Expression
{
public:
    Expression();
    virtual ~Expression();
   //methods
};

以下是Expression的源文件

表达式.cpp

#include "expression.h"
#include <iostream>

Expression::Expression(){}
Expression::~Expression(){}

然后我创建了两个名为 Const 和 Result 的类

常量.h

#include <iostream>
#include "expression.h"

class  Const : public Expression
{
public:
    Const(int value);
    //inherited methods
private:
    int value;
};

和源文件

常量.cpp

#include "expression.h"
#include "Const.h"

Const::Const(int x)
{
    value=x;
};

//inherited methods

结果.h

#include <iostream>
#include "expression.h"
#include "Const.h"

class  Result : public Expression
{
public:
    Result(Const& c);
    //inherited methods
private:
    double value;
};

结果.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*”转换为非标量类型“Result”

问题是这行中描述的内容应该按原样使用,我似乎无法找到确切的内容。

编辑

由于我的错,首先提出的问题显然具有误导性,试图解决这个问题以便准确描述我的问题

【问题讨论】:

标签: c++11 inheritance polymorphism operator-overloading new-operator


【解决方案1】:

如果你有两个派生类 DerivedClass1 和 DerivedClass2 都派生自一些 BaseClass 然后实例化一个指向 DerivedClass1 的指针并以多态方式使用它:

BaseClass* p = new DerivedClass1;

要创建指向DerivedClass2 的基类指针,请使用:

BaseClass* p = new DerivedClass2;

而不是:

DerivedClass1* p = new DerivedClass2;

在您的示例中,Result 和 Const 类都派生自 Expression 类,因此存在混淆。要传入SomeClass&amp; 类型的参数,请创建一个SomeClass 的临时对象并将其传入:

SomeClass o;
someFunction(o);

【讨论】:

  • 感谢您的回答虽然我正在尝试创建 DerivedClass2 的实例,该实例将 DerivedClass1 的对象作为参数以使用其值,但我看不出您的回答如何帮助我,如果是请解释
  • 这样工作得很好
【解决方案2】:

您开始正确地为Const 和Result 创建一个公共基类,但随后完全忽略了它。 你所有的问题确实都在这一行:

Result  res = (new Const(4));

首先,C++ 中的运算符new 返回一个指针,而不是引用。此外,这将是使用您的基类的好地方:

Expression* res = new Const(4);

由于您将方法evaluate() 和print() 声明为virtual,当您调用res-&gt;print() 或res-&gt;evaluate() 时,res 指向的对象将被正确解析为Const 的实例。

这将使用print() 的Const 版本。如果你想使用Result 版本——抽象类在这里对你没有帮助,你需要使用强制转换。在Result 中创建您自己的operator=(Const &amp;) 或在Const 中创建operator Result()。

【讨论】:

  • 我认为您的回答更接近我的问题,我怀疑我无法破译的线路是新运营商超载,但不确定任何帮助将不胜感激
  • 您编辑的问题中的情况更简单,尽管我相信现在的错误是关于从Const* 到Const&amp; 的转换,不是吗?修改 Result 的构造函数以采用指针而不是引用应该可以解决它 - 即使作为引用的参数更有意义,但是由于您无法更改 main()... 请记住 Result 类型的对象现在需要新创建的Consts 的所有权,完成后您必须delete 他们。 ...而且我仍然看不到基类会在哪里发挥作用。
  • 由于构造函数也是继承的并且应该与基类具有相同的参数,我应该创建第二个带指针的参数吗?这意味着在拥有Result(); 的同时,我应该创建Result(Const*)?
  • 在 C++11 之前无法继承构造函数,甚至现在还需要特定的语法(请参阅 here)。我不知道你的确切要求,但如果这条线:Result res (new Const(4)); 保持这种状态,我看不到除了重载构造函数之外的其他选项。
  • 感谢您向我解释问题是什么我根据您给我的材料做了一些研究,尽管还有另一个问题在所有示例中,没有重载的构造函数将另一个类作为参数,更具体地说是另一个派生类,我认为我在这里走到了死胡同
【解决方案3】:

Result 类和Const 是两个不同的类。这意味着类型转换

Result *res = (new Const(4));

不可能。做你想做的事,因为这两个类都继承自Expression,所以:

  Expression * res = new Result( objConst);

其中objConst 是Const 对象。

【讨论】:

    【解决方案4】:

    一个问题是

    double point= value;
    

    不会初始化你的成员,而是一个新的未使用的局部变量。

    只是做

    point = value;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多