【问题标题】:C++ error: redefinition of class [closed]C ++错误:重新定义类[关闭]
【发布时间】:2016-10-11 07:12:19
【问题描述】:

注意:我已经对 SO 进行了彻底的搜索,并且为其他有类似问题的人发布的解决方案在这里对我不起作用。

我正在用 C++ 编写自己的自定义“类字符串”类,并且在编译时遇到以下错误:

./PyString.h:8:11: 错误:'PyString' 的行外声明确实 不匹配“PyString”中的任何声明 PyString::PyString (char*); ^

./PyString.h:9:11: 错误:定义隐式声明的析构函数 PyString::~PyString (void);

pystring.cpp:4:7: 错误:重新定义“PyString”类 PyString {

至于第一个和第二个错误,将析构函数移动到cpp文件中的类定义本身不起作用。

至于第三个错误,我似乎无法修复它——我没有重新定义类!

这里是pystring.h

#ifndef PYSTRING_INCLUDED
#define PYSTRING_INCLUDED

class PyString {
    char* string;
};

PyString::PyString (char*);
PyString::~PyString (void);

#endif

这里是pystring.cpp

#include "PyString.h"
#define NULL 0

class PyString {
    char* string = NULL;
  public:
    PyString(char inString) {
      string = new char[inString];
    };

    ~PyString(void) {
      delete string;
    };
};

作为参考,这里是编译输出的截图:

非常感谢任何帮助。

【问题讨论】:

  • 我认为你应该得到a good beginners book 并重新开始,因为在你显示的源中正确的并不多。
  • 查找在标题中定义的类的任何示例,其成员在.cpp文件中定义。

标签: c++ class compiler-errors g++


【解决方案1】:

您在标头和 cpp 文件中定义类 PyString,而且,函数定义不需要 ; 在其末尾。
而且...您的函数原型需要在您的标题中的类声明中:

pystring.h

class PyString {
public: //ALWAYS indicate what is public/private/protected in your class
    PyString (char* inString);
    ~PyString (); // Don't put void when there's no parameter

private: // All attributes are private
    char* string;
};

pystring.cpp

#include "PyString.h"

PyString::PyString(char* inString) {
    string = inString; // Avoid using new unless you're forced to
}

PyString::~PyString() {
}

【讨论】:

  • PyString:: 不应出现在类定义中(这是一个错误,但一些编译器让它通过)。你对“pystring.c”的建议也是完全错误的
  • 该死,我今天犯了很多错误...谢谢
  • 我将两个 sn-ps 复制到单独的文件中,但据说 PyString::PyString 是一个额外的限定条件。另外,还是说有重新声明。
  • 不会了,我知道为什么人们在此编辑之前支持我的错误答案......
  • @Treycos:我认真地要启动我的 IDE,看看是否完全困惑,如果你之前的答案编译了 ;-) 我的赞成是我的症状欣喜若狂地确信我仍然可以做到这一点。
【解决方案2】:

哦,是的,你是! pystring.h 包含

class PyString {
    char* string;
};

这是一个类声明。声明PyString::PyString (char*); PyString::~PyString (void); 需要在该声明中。

但是您在pystring.cpp 中有类似的东西,指定了附加函数,并定义了其中一些。这就是你的编译器告诉你的。

通常,你完全定义一个class在标题(即所有成员,以及成员函数的声明),并实现 em> 源文件中该类的成员函数。

这里的故事寓意:你不能通过反复试验来真正学习 C++。买一本好书!

【讨论】:

  • 也是一个类定义。那就是问题所在!至少,标题中报告的问题。
  • 对于完全声明,您的意思是完全定义(类,而不是成员。)
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多