我在使用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-&gt; calculate和b-&gt;计算。我完全不知道为什么我需要调用calculate函数才能使它工作。
有人可以向我解释如何实际操作吗?
答案 0 :(得分:3)
首先,您应该打开所有警告(请参阅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);
你只需创建一个临时对象,它会在创建后立即被销毁,你的指针就会被破坏。
您有两种选择:
在动态内存中创建对象(但在这种情况下,我建议使复杂计算所有者更简单)
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));
用引用替换指针。然后你可以使用值语义。
答案 1 :(得分:2)
要获得有效的程序,您甚至不需要使用new
:
CCalc_CONST a(4);
CCalc_CONST b(1);
CCalc_ADD c(&a,&b);
std::cout << "res: " << c.calculate() << "\n";
答案 2 :(得分:0)
您正在尝试访问不再存在的临时对象。使用operator new
为对象分配内存并调用其构造函数。
CCalculation *a = new CCalc_CONST(4);
CCalculation *b = new CCalc_CONST(1);
CCalculation *c = new CCalc_ADD(a,b);
我已经和GCC一起尝试过,它发出了一个非常明确的警告:
test.cpp: In function ‘int main()’:
test.cpp:35:33: error: taking address of temporary [-fpermissive]
test.cpp:36:37: error: taking address of temporary [-fpermissive]
test.cpp:37:37: error: taking address of temporary [-fpermissive]
答案 3 :(得分:0)
你没有使用新的。像这样测试:
CCalculation *a = new CCalc_CONST(4);
CCalculation *b = new CCalc_CONST(1);
CCalculation *c = new CCalc_ADD(a,b);
您可以通过使用-Wall
进行编译来清除临时地址等内容,从而启用所有编译器警告。编译器是你的朋友,可以提供帮助。喜欢编译器。