gpt4 book ai didi

c++ - 继承与类型转换

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:52 25 4
gpt4 key购买 nike

我在使用 C++ 进行类转换时遇到了一些问题。
为了学习,我想创建一个只进行运算(如求和)的类,但每次启动它时它似乎都会崩溃。

这是我的简单类:

#include <iostream>


class CCalculation {
public:
CCalculation() {};
virtual int calculate() = 0;
};


class CCalc_CONST : public CCalculation {
int x;
public:
CCalc_CONST(int a) : x(a) {};
int calculate() { return x; };
};


class CCalc_ADD : public CCalculation {
CCalculation *x;
CCalculation *y;
public:
CCalc_ADD(CCalculation *a, CCalculation *b) {
this->x = a;
this->y = b;
};
int calculate() {
std::cout << "Calculation...\n";
return x->calculate() + y->calculate();
};
};

还有我的测试:

    CCalculation *a = &CCalc_CONST(4);
CCalculation *b = &CCalc_CONST(1);
CCalculation *c = &CCalc_ADD(a,b);

std::cout << "res: " << c->calculate() << "\n";

它似乎每次都崩溃(我没有收到编译器错误或警告)。我发现运行它的唯一方法是当我在 CCalc_ADD 构造中打印 a->calculate 和 b->calculate 时。我完全不知道为什么我需要调用计算函数才能使其工作。

有人可以向我解释一下实际操作方法吗?

最佳答案

首先,您应该打开所有警告(请参阅编译器的文档,在 gcc -Wall 中)

然后你会看到,你的编译器会责怪你:

1.cpp: In function 'int main()':
1.cpp:56:37: error: taking address of temporary [-fpermissive]
1.cpp:57:37: error: taking address of temporary [-fpermissive]
1.cpp:58:37: error: taking address of temporary [-fpermissive]

其实,这里

CCalculation *a = &CCalc_CONST(4);

您只需创建临时对象,该对象将在创建后立即销毁,并且您会得到损坏的指针。

你有两个选择:

  1. 在动态内存中创建对象(但在这种情况下我会建议让复杂的计算拥有者变得更简单)

    class CCalc_ADD : public CCalculation {
    std::unique_ptr<CCalculation> x;
    std::unique_ptr<CCalculation> y;
    public:
    CCalc_ADD(CCalculation *a, CCalculation *b):x(a), y(b)
    {
    };
    int calculate() {
    std::cout << "Calculation...\n";
    return x->calculate() + y->calculate();
    };
    };


    std::unique_ptr<CCalculation> a(new CCalc_CONST(4));
    //...
    CCalc_ADD c (std::move(a), std::move(b));
  2. 用引用替换指针。然后你可以使用值语义。

关于c++ - 继承与类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12043030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com