C++:如何前向声明出现在基 class 的静态方法中的派生 classes?
C++: How can I forward-declare derived classes that appear in a static method of a base class?
只是做一个简单的练习,将我从另一种语言学到的想法翻译成 C++。
我有一个抽象的 class 数字,它有两个派生的 classes,PositiveNumber 和 NegativeNumber。 Number 有一个静态方法,应该 根据其输入的符号创建 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()
的定义需要知道PositiveNumber
和NegativeNumber
有什么构造函数,所以前向声明是不够的。你需要打散Number::fromInt()
的声明和定义,然后你可以把定义移到PositiveNumber
和NegativeNumber
.
的声明下面
此外,不要忘记 delete
fromInt()
new
的对象。这也意味着向 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;
}
只是做一个简单的练习,将我从另一种语言学到的想法翻译成 C++。
我有一个抽象的 class 数字,它有两个派生的 classes,PositiveNumber 和 NegativeNumber。 Number 有一个静态方法,应该 根据其输入的符号创建 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()
的定义需要知道PositiveNumber
和NegativeNumber
有什么构造函数,所以前向声明是不够的。你需要打散Number::fromInt()
的声明和定义,然后你可以把定义移到PositiveNumber
和NegativeNumber
.
此外,不要忘记 delete
fromInt()
new
的对象。这也意味着向 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;
}