【发布时间】:2014-03-12 08:39:27
【问题描述】:
我在开发这个程序时遇到了几个问题,我不明白为什么。
1)我不能调用Terna类的构造方法,用其他两个方法制造商并将值传递给我的兴趣。第 21 和 22 行。
2) 我应该使用“nuovo”方法创建两个对象吗? 在 A 类中应该创建一个 B 类型的对象。 在 B 类中,我应该创建一个 A 类型的对象。 里托南多利。 在新方法中,你虚拟了。
#include <iostream>
#include <stdlib.h>
#include <sstream>
#define DEF 50
using namespace std;
class B;
class Terna{
protected:
int * xyz;
public:
Terna(int _x,int _y,int _z){
xyz = new int[3];
xyz[0] = _x;
xyz[1] = _y;
xyz[2] = _z;
}
Terna(int _x) : Terna(_x, _x, _x){}
Terna(int *_x) : Terna(_x[0],_x[1],_x[2]){}
string toString(){
stringstream t;
t << "[ " << xyz[0] << ", " << xyz[1] << ", " << xyz[2] <<" ]";
return t.str();
}
virtual int m() = 0;
//virtual Terna nuovo(Terna *_t) = 0;
};
class A : public Terna{
public:
A(int _x) : Terna(_x){}
A(int *_x) : Terna(*_x){}
Terna nuovo(Terna *_t){
B * b = new B(m()+xyz[0]);
return b;
}
int m(){
int m = 0;
for(int i=0;i<3;i++)
m += xyz[i];
return m/3;
}
string toString(){
stringstream s;
for(int i=0;i<m();i++)
s << 'x';
return "A:" + Terna::toString()+" "+s.str();
}
};
class B : public Terna{
public:
B(int _x) : Terna(_x){}
B(int *_x) : Terna(*_x){}
Terna nuovo(Terna *_t){
A * a = new A(m()-xyz[1]-xyz[2]);
return a;
}
int m(){
int max = 0;
for(int i=0;i<3;i++)
if(max<xyz[i])
max = xyz[i];
return max;
}
string toString(){
stringstream s;
for(int i=0;i<m();i++)
s << 'x';
return "B:" + Terna::toString()+" "+s.str();
}
};
int manin(){
srand(2999888);
Terna * vett[DEF];
int * x = new int[3];
int max = 0;
for(int i=0;i<DEF;i++){
for(int j=0;j<3;j++)
x[j] = rand()%10;
if(rand()%2 == 1) vett[i] = new A(x);
else vett[i] = new B(x);
if(max<vett[i]->m())
max = vett[i]->m();
}
Terna * vett2[DEF/2];
vett2[0] = vett[0];
vett2[1] = vett[DEF];
for(int i=2;i<DEF;i++)
vett2[i] = vett2[i-1]->nuovo(vett2[i-2]);
return 0;
}
C:\Users\angel\Desktop\method\method7.cpp 在构造函数 'Terna::Terna(int)' 中:
19 35 C:\Users\angel\Desktop\method\method7.cpp [警告] 委托构造函数仅适用于 -std=c++11 或 -std=gnu++11 [默认启用]
C:\Users\angel\Desktop\method\method7.cpp 在构造函数 'Terna::Terna(int*)' 中:
20 43 C:\Users\angel\Desktop\method\method7.cpp [警告] 委托构造函数仅适用于 -std=c++11 或 -std=gnu++11 [默认启用]
C:\Users\angel\Desktop\method\method7.cpp 在全局范围内:
36 9 C:\Users\angel\Desktop\method\method7.cpp [错误] 成员函数 'Terna A::nuovo(Terna*)' 的抽象返回类型无效
7 7 C:\Users\angel\Desktop\method\method7.cpp [注意] 因为以下虚函数在 'Terna' 中是纯的:
26 15 C:\Users\angel\Desktop\method\method7.cpp [注意] virtual int Terna::m()
C:\Users\angel\Desktop\method\method7.cpp 在成员函数 'Terna A::nuovo(Terna*)' 中:
36 9 C:\Users\angel\Desktop\method\method7.cpp [错误] 成员函数 'Terna A::nuovo(Terna*)' 的抽象返回类型无效
7 7 C:\Users\angel\Desktop\method\method7.cpp [注意] 因为类型 'Terna' 具有纯虚函数
37 4 C:\Users\angel\Desktop\method\method7.cpp [错误] 'B' 未在此范围内声明
37 8 C:\Users\angel\Desktop\method\method7.cpp [错误] 'b' 未在此范围内声明
37 16 C:\Users\angel\Desktop\method\method7.cpp [错误] 'B' 之前的预期类型说明符
37 16 C:\Users\angel\Desktop\method\method7.cpp [错误] 预期 ';'在“B”之前
C:\Users\angel\Desktop\method\method7.cpp 在全局范围内:
59 9 C:\Users\angel\Desktop\method\method7.cpp [错误] 成员函数 'Terna B::nuovo(Terna*)' 的抽象返回类型无效
7 7 C:\Users\angel\Desktop\method\method7.cpp [注意] 因为类型 'Terna' 具有纯虚函数
C:\Users\angel\Desktop\method\method7.cpp 在成员函数 'Terna B::nuovo(Terna*)' 中:
59 9 C:\Users\angel\Desktop\method\method7.cpp [错误] 成员函数 'Terna B::nuovo(Terna*)' 的抽象返回类型无效
7 7 C:\Users\angel\Desktop\method\method7.cpp [注意] 因为类型 'Terna' 具有纯虚函数
61 11 C:\Users\angel\Desktop\method\method7.cpp [错误] 从 'A*' 到 'int' 的无效转换 [-fpermissive]
19 3 C:\Users\angel\Desktop\method\method7.cpp [错误] 初始化 'Terna::Terna(int)' 的参数 1 [-fpermissive]
61 11 C:\Users\angel\Desktop\method\method7.cpp [错误] 无法分配抽象类型“Terna”的对象
7 7 C:\Users\angel\Desktop\method\method7.cpp [注意] 因为类型 'Terna' 具有纯虚函数
C:\Users\angel\Desktop\method\method7.cpp 在函数'int manin()'中:
100 26 C:\Users\angel\Desktop\method\method7.cpp [错误] 'class Terna' 没有名为 'nuovo' 的成员
【问题讨论】:
-
将代码提取到显示错误的最小块中,并在此处发布
-
如果有人不知道错误,请不要对他投反对票。OP 发布代码以及错误。那么你还想要什么
-
@JKB:一个最小的例子,这是本网站的政策和常识所要求的。哦,还有,一个问题。
-
@Lightness Races in Orbit
minimal example但在这里 OP 发布了整个代码。所以任何人都在自己的机器上编译以重现错误。所以你想从 OP 得到什么击球手。可能想要远程访问 OP机器 :)。所以仍然有一些血腥的感觉投反对票。 -
@JKB:你没有抓住重点。阅读stackoverflow.com/help/mcve,了解为什么一个最小的例子是有用的和预期的。并不是我们不能编译 OP 的代码——而是,现在,他实际上是在要求我们为他为他进行他的分而治之的调试,而这不是 SO 的用途。 SO 不是个人调试帮助台。除此之外,如果 OP 已经完成了足够多的预先询问工作,他将已经有一个最小的示例;这表明他仍然应该自己解决问题。谢谢。
标签: c++ c++11 constructor virtual