1

我正在尝试理解 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++告诉我所有使用我自己类型的构造函数都是无效的。你能解释一下出了什么问题吗?我已经定义了类原型,我还应该做什么?提前致谢!

4

3 回答 3

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 引用,但是在这种情况下你可以依赖编译器——它会为你生成复制构造函数——所以完全删除它。

于 2012-10-28T01:08:05.127 回答
2

G++ 已经告诉你,出了什么问题:

错误:无效的构造函数;你可能的意思是'bool_type(const bool_type&)'

而不是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_typeprivate:bool_typebaseget()

int_type(bool_type init)     { base = long(init.get()); }

类似地,您必须定义:

inline bool_type(int_type init) { base = bool(init.get()); }

最后,查看c++并按照书单进行操作。C++ FAQ也相当不错。

编辑:我错过了,你的get()方法根本不是访问者。它们应定义为:

class bool_type {
public:
    bool get() const { return base; }
...
};

相同的int_type::get()

int get() const { return base; }
于 2012-10-28T11:39:04.770 回答
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()) { }
于 2012-10-28T01:08:56.783 回答