我正在尝试理解C ++中的类并开发一些我在Python中看到的类似类。这是代码:
#include <iostream>
#include <cmath>
using namespace std;
/*============================================================================*/
/* Define types
/*============================================================================*/
class none_type;
class bool_type;
class int_type;
struct identifier;
/*============================================================================*/
/* Define none type
/*============================================================================*/
class none_type {
public:
none_type() { /* constructor */ };
~none_type() { /* destructor */ };
}; /* none_type */
/*============================================================================*/
/* Define bool type
/*============================================================================*/
class bool_type {
private:
bool base;
public:
bool_type() { base = false; };
~bool_type() { /* destructor */ };
bool_type(bool init) { base = bool(init); };
bool_type(int init) { base = bool(init); };
bool_type(long init) { base = bool(init); };
bool_type(float init) { base = bool(init); };
bool_type(double init) { base = bool(init); };
bool_type(bool_type init) { base = bool(init.base); };
bool_type(int_type init) { base = bool(init.base); };
int get() { cout << base << endl; };
}; /* bool_type */
/*============================================================================*/
/* Define int type
/*============================================================================*/
class int_type {
private:
long base;
public:
int_type() { base = 0; };
~int_type() { /* destructor */ };
int_type(bool init) { base = long(init); };
int_type(int init) { base = long(init); };
int_type(long init) { base = long(init); };
int_type(float init) { base = long(init); };
int_type(double init) { base = long(init); };
int_type(bool_type init) { base = long(init.base); };
int_type(int_type init) { base = long(init.base); };
int get() { cout << base << endl; };
}; /* int_type */
当我尝试编译它时,g++
告诉我使用我自己的类型的所有构造函数都是无效的。你能解释一下有什么问题吗?我已经定义了类原型,我还应该做什么?提前谢谢!
答案 0 :(得分:3)
这个构造函数:
bool_type(int_type init) { base = bool(init.base); };
无效,因为此时int_type不完整。
您必须将此构造函数实现移出类定义,直到int_type完成:
class bool_type {
bool_type(int_type init);
};
class int_type {};
inline bool_type::bool_type(int_type init) { base = bool(init.base); };
另一个问题是您的构造函数假装是复制构造函数:
bool_type(bool_type init) { base = bool(init.base); };
这里有无限递归 - 因为init
参数是一个副本 - 所以必须调用这个构造函数来创建这个副本,但是这个构造函数的下一个调用有它自己的init
参数必须被复制等等到无穷大或堆叠限制......
复制构造函数的正确定义如下:
bool_type(const bool_type& init) { base = bool(init.base); };
必须使用Const引用,但是在这方面您可以依赖编译器 - 它将为您生成复制构造函数 - 所以只需删除它。
答案 1 :(得分:2)
G ++已经告诉你,出了什么问题:
错误:构造函数无效;你可能的意思是'bool_type(const bool_type&amp;)'
您必须使用bool_type (bool_type)
而不是bool_type (const bool_type&)
。原因是,如果按值传递对象,编译器将使用复制构造函数将其放在堆栈中。因此,为了将bool_type
传递给复制构造函数bool_type(bool_type)
,它必须使用复制构造函数本身。这是不可能的。
同样适用于int_type(int_type)
。
在构造函数'bool_type :: bool_type(int_type)'中: 错误:'init'类型不完整
此时,G ++并不了解int_type
的外观。由于它不知道int_type
有base
成员,因此无法使用它。只需声明构造函数:
bool_type(int_type init);
并在声明int_tpye
:
....
class int_type {
....
};
...
inline bool_type(int_type init) { base = bool(init.base); }
当你有更大的对象时,建议使用通过引用传递它们,因为按值传递意味着复制堆栈上的对象。对于大型对象来说,这比仅仅传递对这个大对象的引用要贵得多。对于小物件,这并不重要。
最后一个错误:
在构造函数'int_type :: int_type(bool_type)'中: 错误:'bool bool_type :: base'是私有的
您已将base
中的成员bool_type
声明为private:
。这意味着,只允许bool_type
访问此成员。要获得base
,您必须使用访问方法get()
:
int_type(bool_type init) { base = long(init.get()); }
类似地,您必须定义:
inline bool_type(int_type init) { base = bool(init.get()); }
最后,请查看c++-faq或c++并按照图书清单进行操作。 C++ FAQ也很不错。
编辑:我错过了,您的get()
方法根本不是访问者。它们应定义为:
class bool_type {
public:
bool get() const { return base; }
...
};
int_type::get()
int get() const { return base; }
答案 2 :(得分:1)
很难给出“学习C ++”之外的具体建议,但是这里的类是如何用“普通”C ++设计的:
class int_type;
class none_type { };
class bool_type
{
bool base;
public:
bool_type() : base() { }
explicit bool_type(bool init) : base(init) { }
explicit bool_type(int_type const &);
void print() const { std::cout << base << std::endl; }
bool get() const { return base; }
};
class int_type
{
int base;
public:
int_type() : base() { }
explicit int_type(int init) : base(init) { }
explicit int_type(bool_type const & init) : base(init.get() ? 1 : 0) { }
void print() const { std::cout << base << std::endl; }
int get() const { return base; }
};
inline bool_type::bool_type(int_type const & init) : base(init.get()) { }