【问题标题】:Call the constructor from another constructor of the same class从同一个类的另一个构造函数调用构造函数
【发布时间】: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


【解决方案1】:

如果你在一个类中这样做virtual int m() = 0你有一个抽象类,抽象类不能用于实例化对象,但它可以用来创建指针,所以nuovo应该返回一个指向Terna的指针。

【讨论】:

    【解决方案2】:

    委托构造函数似乎是允许的。您只会收到有关它的警告。

    第一个错误是关于您返回 Terna 实例的事实。这个不允许。它被认为是一个抽象类,因为您有一个纯虚拟(OO 术语中的抽象)方法。你永远不可能有一个具体的例子。

    您应该使用指向 Terna 的指针。

    另请注意,您的主要功能称为 manin。错字?

    另请注意,您在 B 被编译器“看到”之前使用它。这就是为什么你得到了

    [Error] 'B' was not declared in this scope
    

    【讨论】:

      【解决方案3】:

      由于virtual int m() = 0;,您无法创建Terna 类的实例

      修改 nuovo 以返回指针,而不是对象。

      当然,用-std=c++11编译

      此外,您不能在 A::nuovo() ... 中使用不完整的类 B ...(您只需使用 class B; 转发声明)

      建议:在.h.cpp中正确拆分文件,然后你的问题应该得到解决。

      【讨论】:

        猜你喜欢
        • 2012-06-22
        • 1970-01-01
        • 2011-03-24
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多