0

我已经非常广泛地阅读了这两个错误,但尽管我付出了所有努力,但我在这里看不到问题所在。我已经完全用标题保护淹没了我的代码,看看这是否有帮助,结果没有改变。这是每个文件: Mystring.cpp

#pragma once
#include "MyString.h"

#ifndef MYSTRING_CPP
#define MYSTRING_CPP

using namespace std;

    MyString::MyString(char chars[]){
        str = (char*) malloc(strlen(chars));
        str = chars;
    }

    //etc, other methods as defined in header file

#endif

我的字符串.h

#pragma once
#include <string.h>
#include <iostream> 
#ifndef MYSTRING_H
#define MYSTRING_H
using namespace std;
class MyString {
protected:
    char * str;
public:
    ~MyString();
    MyString(char chars[]);
    MyString(const char chars[]);
    MyString();
    int length();
    void resize(int n, char c);
    void clear();
    bool empty();
    void insert(int pos1, const MyString& str);
    void insert (int pos1, const char* s);
    void erase (int pos, int n);
    int find(const MyString& str);
    int find(const char* s);
    int compare(const MyString& str);
    int compare(const char* s);
    const char* getStr() const;
    MyString::MyString(const MyString &that);
    MyString & operator=(const char chars[]);
    MyString & operator=(const MyString& str);

};

#endif

MystringDerived.h

#pragma once
#include "MyString.cpp"
#ifndef MYSTRINGDERIVED_H
#define MYSTRINGDERIVED_H
class MyStringDerived :
    public MyString
{
public:

    MyStringDerived(char chars[]);
    bool operator>(MyString rhs);
    bool operator>=(MyString rhs);
    bool operator<(MyString rhs);
    bool operator<=(MyString rhs);
    bool operator==(MyString rhs);
    bool operator!=(MyString rhs);
    bool operator+(MyString rhs);
    bool operator[](MyString rhs);
    MyStringDerived(void);
    ~MyStringDerived(void);
};

#endif

MyStringDerived.cpp

    #pragma once
#include "MyStringDerived.h"
#ifndef MYSTRINGDERIVED_CPP
#define MYSTRINGDERIVED_CPP

MyStringDerived::MyStringDerived(char * const)
{
}


MyStringDerived::~MyStringDerived(void)
{
}
#endif

和我得到的错误

    1>test.obj : error LNK2005: "public: int __thiscall MyString::length(void)" (?length@MyString@@QAEHXZ) already defined in MyString.obj
1>test.obj : error LNK2005: "public: void __thiscall MyString::resize(int,char)" (?resize@MyString@@QAEXHD@Z) already defined in MyString.obj
1>C:\Users\Arthur\Documents\Visual Studio 2012\Projects\Project1\Debug\Project2.exe : fatal error LNK1169: one or more multiply defined symbols found

有数百个错误行都看起来像这样。以我组织包含的方式,我绝对看不出我最终会如何包含多个副本。还有什么我想念的吗?任何见解都值得赞赏。这是作业(显然),所以当我在这里完成时,我肯定想真正理解问题。没有人向我展示过我做错了什么。

谢谢!

忘记包含 test.cpp。目前就这么简单:

MyStringDerived m = "测试"; cout<< m.getStr(); 获取字符();返回0;

4

1 回答 1

2

我认为问题出在 MyStringDerived.h 的第 2 行。当您应该包含 MyString.h 时,您正在包含 MyString.cpp

[更新]

按照您的编码方式,MyString.cpp 的所有定义都被编译到 MyString.obj 文件中——这很好,也应该如此。不幸的是,由于您的#include,MyString.cpp 的所有定义也出现在 MyDerivedString.obj 中

要真正理解为什么这是一个问题,您需要花一些时间来研究声明和定义之间的区别——只需谷歌“c++ 声明与定义”即可。这是一篇可能会有所帮助的文章。http://www.cprogramming.com/declare_vs_define.html

任何“声明”的内容都可以一次又一次地包含在程序中而不会造成任何损害。任何已定义的内容必须在链接到应用程序的所有对象文件中出现一次且仅出现一次。

这导致以下一般准则:

头文件 (.h) 只能包含声明。它不能包含任何定义。只有 .cpp 文件可以包含定义。然后你必须确保永远不要#include .cpp 文件。这是确保您在链接时永远不会有重复定义的最简单方法。

于 2012-10-20T01:41:35.567 回答