C++ C++;错误:类的重新定义
注意:我已经彻底搜索了SO,针对其他类似问题发布的解决方案在这里对我无效 <>我在C++中编写自己的自定义“string类”类,编译时,我遇到以下错误: ./PyString.h:8:11:错误:“PyString”的声明行外 不匹配“PyString”PyString::PyString(char*)中的任何声明; ^ ./PyString.h:9:11:错误:隐式声明的析构函数PyString的定义::~PyString(void) pystring.cpp:4:7:错误:“pystring”类pystring的重新定义{ 至于第一个和第二个错误,在C++ C++;错误:类的重新定义,c++,class,compiler-errors,g++,C++,Class,Compiler Errors,G++,注意:我已经彻底搜索了SO,针对其他类似问题发布的解决方案在这里对我无效 我在C++中编写自己的自定义“string类”类,编译时,我遇到以下错误: ./PyString.h:8:11:错误:“PyString”的声明行外 不匹配“PyString”PyString::PyString(char*)中的任何声明; ^ ./PyString.h:9:11:错误:隐式声明的析构函数PyString的定义::~PyString(void) pystring.cpp:4:7:错误:“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;
};
};
以下是编译输出的屏幕截图供参考:
非常感谢您的帮助。哦,是的!pystring.h包含
class PyString {
char* string;
};
这是一个类声明。声明PyString::PyString(char*);
而PyString::~PyString(void);
需要在该声明中
但是在pystring.cpp
中也有类似的内容,指定了附加函数,并定义了其中的一些函数。这就是编译器告诉您的
通常,您可以在头中完全定义一个类
(即所有成员和成员函数的声明),并在源文件中实现该类的成员函数
<> P>这个故事的寓意:你不能真正通过试验和错误来学习C++。得到一本好书! 你在你的头和CPP文件中定义你的类PySnand,而且函数定义不需要<代码>;结束。 并且…您的函数原型需要位于标题中的类声明中: 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() {
}
我认为您应该重新开始,因为您显示的源代码中没有多少内容是正确的。请查找头中定义的类的任何示例,其成员在
.cpp
文件中定义。它也是一个类定义。这就是问题所在!至少,标题中报告的问题。对于完全声明,您的意思是完全定义(类,而不是成员。)PyString::
不应出现在类定义中(这是一个错误,但某些编译器允许它通过)。还有您对“PyString.c”的建议是完全错误的该死,我今天犯了很多错误…谢谢我把这两个片段都复制到了单独的文件中,但is说PyString::PyString
是一个额外的限定。此外,它仍然说有一个重新声明。它不会再出现了,idk为什么人们在这次编辑之前高估了我的错误答案…@Treycos:我是我正准备启动我的IDE,看看你之前的答案是否得到了编译,这完全是一种困惑;-)我的投票是一种高兴的表现,因为我确信我仍然可以做到这一点。