繁体   English   中英

C++:如何转发声明出现在基类 class 的 static 方法中的派生类?

[英]C++: How can I forward-declare derived classes that appear in a static method of a base class?

只是做一个简单的练习,将我从另一种语言学到的想法翻译成 C++。

我有一个抽象的 class Number,它有两个派生类,PositiveNumber 和 NegativeNumber。 Number 有一个 static 方法,它应该根据输入的符号创建 PositiveNumber 或 Negative number 的新实例。

#include <iostream>

class Number
{
public:
protected:
    int magnitude_;
public:
    static Number* fromInt(int x)
    {
        if (x >= 0) { return new PositiveNumber(x); }
        else        { return new NegativeNumber(x); }
    }
    int getMagnitude() { return magnitude_; }
    virtual void print() = 0;
};

class PositiveNumber: public Number
{
protected:
public:
    PositiveNumber(int magnitude) { magnitude_ = magnitude; }
    void print() { std::cout << magnitude_ << "\n"; }
};

class NegativeNumber: public Number
{
protected:
public:
    NegativeNumber(int magnitude) { magnitude_ = magnitude; }
    void print() { std::cout << "-" << magnitude_ << "\n"; }
};


int main (int argc, char* argv[])
{
    Number* x = Number::fromInt(5);
    x->print();

    return 0;
}

我知道我需要告诉 Number PositiveNumber 和 NegativeNumber 存在,但我不确定该怎么做。 我尝试添加

class PositiveNumber;
class NegativeNumber;

在 Number 的定义之前,但这还不够,结果是:

use of undefined type 'PositiveNumber'
use of undefined type 'NegativeNumber'

我确定这有一个简单的答案,但我对调试 C++ 的东西还很陌生,所以我很迷茫。 谢谢阅读。

fromInt()的定义需要知道PositiveNumberNegativeNumber有什么构造函数,所以前向声明是不够的。 您需要分解Number::fromInt()的声明和定义,然后您可以将定义移动到PositiveNumberNegativeNumber的声明下方。

另外,不要忘记delete fromInt() new的 object。 这也意味着向Number添加一个虚拟析构函数,以便可以从基数Number*指针正确调用派生的析构函数。

尝试这个:

#include <iostream>

class Number
{
protected:
    int magnitude_;
public:
    static Number* fromInt(int x);

    virtual ~Number() {}

    int getMagnitude() { return magnitude_; }
    virtual void print() = 0;
};

class PositiveNumber: public Number
{
public:
    PositiveNumber(int magnitude) { magnitude_ = magnitude; }
    void print() { std::cout << magnitude_ << "\n"; }
};

class NegativeNumber: public Number
{
public:
    NegativeNumber(int magnitude) { magnitude_ = magnitude; }
    void print() { std::cout << "-" << magnitude_ << "\n"; }
};

Number* Number::fromInt(int x)
{
    if (x >= 0) { return new PositiveNumber(x); }
    else        { return new NegativeNumber(x); }
}

int main (int argc, char* argv[])
{
    Number* x = Number::fromInt(5);
    x->print();
    delete x;

    return 0;
}

在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM