【问题标题】:c++ compiling error related to constructor/destructor definition与构造函数/析构函数定义相关的c ++编译错误
【发布时间】:2010-10-17 00:27:29
【问题描述】:

我正在尝试定义我的类的构造函数和析构函数,但我不断收到错误:

隐式声明的'x::x()'的定义

什么意思?

部分代码:

///Constructor
StackInt::StackInt(){
    t = (-1);
    stackArray = new int[20];
};

///Destructor
StackInt::~StackInt(){
    delete[] stackArray;
}

【问题讨论】:

  • 您的文件结构如何(*.h、*.cpp)?发布的代码在哪个文件中?

标签: c++ constructor destructor


【解决方案1】:

在类声明中(可能在头文件中),您需要有如下内容:

class StackInt {
public:
    StackInt();
    ~StackInt();  
}

让编译器知道您不想要默认的编译器生成的版本(因为您提供了它们)。

声明可能不止这些,但您至少需要这些 - 这将帮助您开始。

您可以通过使用非常简单的方法看到这一点:

class X {
        public: X();   // <- remove this.
};
X::X() {};
int main (void) { X x ; return 0; }

编译它就可以了。然后删除带有注释标记的行并再次编译。然后你会看到你的问题出现了:

class X {};
X::X() {};
int main (void) { X x ; return 0; }

qq.cpp:2: error: definition of implicitly-declared `X::X()'

【讨论】:

  • 谢谢。这正是问题所在。
  • @MB,当你回答时我正在做一个测试程序,所以我想我会添加它而不是做出一个竞争性的答案,说同样的事情。然后我赞成你更好的答案:-)
【解决方案2】:

要记住的另一件事是构造函数访问的所有内容都必须是公共的。我之前遇到过这个错误。

class X{
   T *data;
 public:      // <-move this to include T *
   X();
   ~X();
}

这段代码仍然有错误,因为在我的构造函数中我有以下内容:

X::X(){data = new T();

这意味着虽然我已经公开了构造函数和析构函数,但它们使用的数据仍然是私有的,并且我仍然收到“隐式声明的定义”错误。

【讨论】:

  • 这根本不正确。构造函数可以访问任何私有成员变量,这通常是它的大部分工作。
  • 是的,构造函数可以访问任何私有成员变量,但只能访问它自己的类。 这意味着如果你的构造函数想要访问 T *data 的私有变量它应该是公开的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2011-04-03
  • 2010-12-16
  • 1970-01-01
相关资源
最近更新 更多